15.10.2010, 10:24 Uhr

Visual Studio 2010 - Codegenerierung über Templates

Visual Studio bietet für die automatische Code-Generierung eine interessante Technik, die nicht jeder Entwickler kennen dürfte. Diese Technik basiert auf Textvorlagen und wird T4 genannt. Mit ihr lassen sich beliebige Textdateien vorlagengesteuert anlegen, was zum Beispiel beim Entity Framework genutzt wird, um Entwicklern die Möglichkeit zu bieten die Codegenerierung zu beeinflussen. Die Codegenerierung über Templates kann aber auch in Alltagssituationen sehr nützlich sein.
Eine Textvorlage für die Codegenerierung besitzt eine einfache Funktion. Die Vorlage ist eine Textdatei, die zwei "Sorten" von Textelementen enthält: Solche, die 1:1 in die generierte Codedatei übernommen werden, und solche, die Anweisungen darstellen, welche festlegen was in die Codedatei eingefügt wird. Code-Vorlagen sind sehr praktisch, da sie es Entwicklern erlauben, Codedateien mit einem Grundgerüst zu erstellen, dessen Aufbau über Parameter festgelegt wird (solche "künstlich" erzeugten Quellcode-Elemente werden in diesem Zusammenhang auch "Artefakte" genannt). Visual Studio bietet bereits seit Visual Studio 2008 eine integrierte Code-Template-Engine mit dem eindrucksvollen Namen Text Template Transformation Toolkit, kurz T4. Sie ist ein fester Bestandteil der IDE (auch bei den Express Editionen) und muss daher nicht nachträglich installiert werden. Über Code-Vorlagen kann jede beliebige "Sorte" von Projektdatei erstellt werden: Quelltextdateien in C# und VB, Dateien mit SQL-Statements, Konfigurationsdateien, beliebiger Text - was durch eine Code-Vorlage erstellt wird, spielt keine Rolle.Neu: Template-Vorlagen bei VS 2010Der Umstand, dass die Codegenerierung über Templates beim Entwickeln mit Visual Studio bislang keine allzu große Rolle gespielt hat mag damit zusammenhängen, dass es bei Visual Studio 2008 weder Vorlagen noch Menüeinträge gab. Nur weniger Insider wussten, dass man lediglich eine Textdatei mit der Spezial-Erweiterung .tt hinzufügen musste, um ein Template für die Codegenerierung zu erhalten. Erst mit Visual Studio 2010 kamen zwei Vorlagen in der Kategorie Allgemein hinzu: Textvorlage und Vorverarbeitete Textvorlage. Weitere Vorlagen gibt es im Internet, z.B. unter [5]. Nach der Auswahl einer Vorlage erscheint eine Sicherheitswarnung, die jedoch kein Anlass zur Besorgnis ist. Sie weist lediglich daraufhin, dass Textvorlagen aus nicht vertrauenswürdigen Quellen eine potentielle Gefahr darstellen, da mit dem Umsetzen der Vorlage Programmcode ausgeführt wird. Abb. 1: Visual Studio 2010 bietet zwei Template-Vorlagen an Ein Hallo, Welt mit TemplateEin sehr einfaches Beispiel soll den generellen Umgang mit einem Code-Template veranschaulichen. Nach der Auswahl der Vorlage Textvorlage in ein Projekt wird in die Vorlage der folgende Inhalt eingegeben:<#@ output extension=".cs" #>Heute ist ein schöner Tag Um die Template Engine dazu zu bringen, die Vorlage umzusetzen, gibt es mehrere Möglichkeiten. Die einfachste Möglichkeit besteht darin, die Datei zu speichern. Der offizielle Weg besteht in einem Rechtsklick auf die Datei im Projektmappen-Explorer und der Auswahl von "Benutzerdefiniertes Tool ausführen". Während der Text zwischen <# und #> die Umsetzung steuert, wird der folgende Satz 1:1 in die generierte Quellcodedatei übernommen (dass dabei ein Compile-Fehler resultiert spielt im Moment keine Rolle). Enthält ein Projekt mehrere Templates, bietet der Projektmappen-Explorer den Button Alle Vorlagen transfomieren.Die nächste Erweiterung fügt eine Kommentarzeile ein, in der die aktuelle Uhrzeit enthalten ist:<#@ output extension=".cs" #>// Per Template generiert- um <#= DateTime.Now.ToShortTimeString() #>Heute ist ein schöner Tag Dieses Mal sorgt das Metazeichen <#= dafür, dass ein Ausdruck in die Quellcodedatei eingefügt wird. Die nächste Erweiterung sorgt dafür, dass der Satz nicht 1 Mal, sondern 10 Mal eingefügt wird:<#@ output extension=".cs" #>// Per Template generiert- um <#= DateTime.Now.ToShortTimeString() #><# for(int i=0;i<10;i++) #>Heute ist ein schöner Tag Die vertraute Zählschleife wird, da sie von einem <# #> eingerahmt wird, bereits während der Transformation ausgeführt. Das Ergebnis ist aber optisch nicht besonders ansprechend, da die Sätze nebeneinander gereiht werden. Soll die Ausgabe zeilenweise erfolgen, muss sie über die WriteLine-Methode gesteuert werden, die während der Transformation ausgeführt wird:<#@ output extension=".cs" #>// Per Template generiert- um <#= DateTime.Now.ToShortTimeString() #><# for(int i=0;i<10;i++)WriteLine("Heute ist ein schöner Tag"); #> Der Text wird dadurch nicht einfach 1:1 übernommen, sondern im Rahmen der Transformation ausgegeben. Abb. 2.: Das Prinzip der Template-TransformationCode-Vorlagen spielen ihre Vorteile erst dann aus, wenn sie mit variablen Elementen arbeiten. Listing 1 zeigt ein "Hallo, Welt"-Beispiel mit einer Abfrage der Ländereinstellung, von der die Auswahl der passenden Begrüßung abhängig ist. Für diese "Spielereien" braucht es natürlich keine Templates. Bei dem Beispiel geht es lediglich um das Prinzip der Trennung von Code, der während der Transformation ausgeführt wird, und jenen Code, der 1:1 in die Vorlage übernommen wird. Microsoft nutzt Code-Templates unter anderem intensiv beim Entity Framework 4.0, bei ASP.NET MVC und auch im Rahmen im der UML-Modellierung, wo jedes Mal komplexe Codeartefakte entstehen. <#@ output extension=".txt" #><#@ import namespace="System.Threading" #><#@ import namespace="System.Globalization" #><#string Gruss;switch (Thread.CurrentThread.CurrentCulture.Name){case "de-DE":Gruss = "Guten Tag";break;case "de-CH":Gruss = "Gruezi";break;default:Gruss = "Hi";break;}#>Begrüssung: <#= Gruss #><# WriteLine("Vielen Dank, das war's."); #>Listing 1: Ein Code-Template mit variabler Begrüßung Es ist wichtig zu verstehen, dass beim Speichern einer Code-Vorlage kein mechanischer Austausch stattfindet, sondern ein Abspeichern dazu führt, dass eine Klasse mit dem Namen GeneratedTextTransformation vom Typ TextTransformation (Namespace Microsoft.VisualStudio.TextTemplate) angelegt wird, die von der Template-Engine kompiliert wird. Der Aufruf der (überschreibbaren) TransformText-Methode führt dazu, dass die Output-Datei generiert wird. WriteLine ist daher eine Methode der Template-Klasse (und nicht etwa der Console-Klasse). Der gesamte Mechanismus wird unter [1] ausführlich beschrieben. Abb. 2 veranschaulicht das Prinzip der Transformation.Auch das Debuggen der Transformation ist möglich. Dazu muss das Debug-Attribut bei der Template-Direktive auf "True" und ein Haltepunkt über ein System.Diagnostics.Debugger.Break() gesetzt werden. Damit besteht die Möglichkeit, die Transformation im Debugger nachzuvollziehen. Automatische Klassengenerierung Listing 2 zeigt ein etwas praxisnaheres Beispiel, bei dem auf der Grundlage einer Reihe von Property-Namen der Code für eine Klasse definiert wird, in der die Properties enthalten sind.<#@ output Extension=".cs" #><#@ import Namespace="System.Collections.Generic" #><#string KlassenName="TestKlasse";Dictionary Props = new Dictionary();Props.Add("Vorname",typeof(string));Props.Add("Nachname", typeof(string));Props.Add("Alter", typeof(int));#>using System;namespace TestApp{public class <#= KlassenName #>{<# foreach(string name in Props.Keys) { #>public <#=Props[name].Name#> <#=name#>{get; set; }<# } #>}}Listing 2: Das Template generiert eine Klassendefinition mit Properties, deren Namen Teil einer Collection sind Abb. 3: Syntax-Hervorhebung und Auswahllisten erleichtern den Umgang mit Template-Code EF4 und T4Beim Entity Framework 4.0 spielen T4-Templates eine zentrale Rolle. Dazu wird im EF-Designer mit der rechten Maustaste der Eintrag "Neues Codegenerierungselement hinzufügen" und danach die Code-Generator-Vorlage "ADO.NET Entity Object Generator" gewählt. Wird das Modell gespeichert, wird der Code für den Zugriff auf das Entitätsmodell über diese Vorlage generiert. Vorteil: Entwickler können den generierten Code nachträglich modifizieren.Mehr Komfort mit dem T4-EditorSpeziell bei VS 2008 bietet die IDE keinerlei Unterstützung für Code-Templates. Hier empfiehlt sich z.B. der T4 Editor von Tangible Engineering, der ein Syntax-Highlighting und Auswahllisten bei der Eingabe bietet [4]. Damit wird der Umgang mit Code-Templates auch unter VS 2008 sehr komfortabel.Links[1] http://www.olegsych.com/2008/05/t4-architecture[2] Was ist neu bei T4 und VS 2010 - http://msdn.microsoft.com/en-us/library/ee848143.aspx[3] http://blogs.msdn.com/b/garethj/archive/2010/04/15/what-s-new-in-t4-in-visual-studio-2010.aspx [4] http://t4-editor.tangible-engineering.com/Download_T4Editor_Plus_ModelingTools.html [5] http://t4toolbox.codeplex.com/ Peter Monadiemi


Das könnte Sie auch interessieren