T4-Vorlage und run-time-Parameter
Baue ich ein plug-in in VS 2010 und ich stecken in der T4-generation.
Jetzt habe ich realisiert (wie MSDN schon sagt) eine benutzerdefinierte T4-host zu generieren, meine T4-Ergebnisse, und ich benutze es auf diese Weise:
const string content = @"c:\Simple.tt";
var engine = new Engine();
var host = new MyTemplateHost();
var result = engine.ProcessTemplate(File.ReadAllText(content), host);
foreach (CompilerError error in host.Errors)
{
Console.WriteLine(error.ErrorText);
}
Dieser funktioniert, bis ich übergeben Sie einen parameter in der Vorlage. Sobald ich einen parameter erstellen, der in die .tt-Datei, die Host-freak heraus sagen, dass es nicht weiß wie es zu lösen.
Ich sah, dass Sie verwenden können, die TemplateSession zu tun, aber ich habe nicht herausfinden, wie es passieren mein Host?
Gibt es eine bessere Art und Weise der Generierung von code aus einem .tt mit C# und übergabe von Parametern zur Laufzeit? Vielleicht bin ich auf dem falschen Weg.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Innerhalb von Visual Studio 2010 die T4-template-engine wurde grundlegend geändert.
Nun kann man direkt eine Vorlage-Datei, und übergeben, um es alle parameter Art Sie wollen.
Dieser Anweisung wird die Verarbeitung der folgenden Vorlage:
Also ehrlich gesagt, der host ist nicht wirklich mehr benötigt ...
Initialize()
Sie könnte auch überprüfen Sietemplate.Errors.HasErrors
um zu sehen, ob die Typen waren richtig übergeben 🙂Wenn Sie ein add-in für VS, die Sie wahrscheinlich nicht brauchen einen eigenen host, sondern können stattdessen die built-in-VS-host über seine service-Schnittstelle.
Check-out ITextTemplating als Kern-service-API, das Sie durch Gießen Ihre DTE-Objekt, um einen IServiceProvider, dann Aufruf von GetService(typeof(STextTemplating))
Parameter übergeben, können Sie dann sidecast die ITextTemplating Objekt ITextTemplatingSessionHost und das Session-Eigenschaft auf eine Umsetzung der ITextTemplatingSession. Eine Sitzung ist im Grunde nur eine Eigenschaft, serialisierbar Tasche. Es ist trivial, sofern als TextTemplatingSession.
Beurteilung und Umsetzung der ITextTemplatingSessionHost, um Ihre eigenen host. Nur die Umsetzung der ITextTemplatingEngineHost nicht geben Sie die session-Unterstützung.
Verwendung von T4-Vorlagen für die Laufzeit-Generierung
Wählen Sie diese Methode, wenn Sie brauchen, um code zu generieren zur Laufzeit. Sie möchten zum Beispiel generieren einer Page-Objekt mit Selen.
Erstellen Sie einen Ordner in Ihrer Lösung, name es Vorlagen (guter name für
T4-Vorlagen).
Als Nächstes fügen Sie ein neues Element von Typ T4, dann Holen die
Runtime-Text-Vorlage.... Wir nannten unsere Vorlage MyNodeName.tt, die Sie in dem Bild sehen.
Fügen Sie Ihrem code, wie unten dargestellt, wird der Obere Teil war von Visual Studio eingefügt...
Können Sie sehen, dass wir weitergeben wollen in den Namespace und Klassenname (diese sind das Modell.NameSpaceName und Modell.ClassName markup oben gesehen.
Der schwierige Teil ist, zu lernen, gewusst wie: übergeben Sie in den Parametern...
Erstellen Sie eine neue CS-Klasse mit den Namen teilweise in den Namen der Datei.
Aber in der Klasse nicht name es MyNodeNamePartial name es MyNodeName wie diese:
Dies ist der gleiche name wie der TT-Datei. (MyNodeName) die es schafft, die eigene partielle Klasse. Aber jetzt bemerken, haben wir einen Wert mit dem Namen MODELL dieser Klasse geben..
Modell-Klasse enthält den Klassennamen und NameSpaceName und alles, was Sie möchten, "inject" in die Vorlage.
Der Schlüssel zu dieser Arbeit, wie gezeigt,,
ist, dass die Laufzeit-Text der Vorlage verwendet wurde! Wenn Sie einen Text-Vorlage, egal was Sie tun, Sie werden sehen, Fehler ähnlich "Modell nicht gefunden" oder andere zweideutige Fragen.
Debugging-Tipps:
"Das Modell kann nicht gefunden werden" ist der T4-generation-code, der Ihnen mitteilt, dass in Ihrem partial-Klasse mit der Variablen-MODELL, dass es ihn nicht finden kann! Überprüfen Sie beide Ihre partielle und den Modell-Typen, um sicherzustellen, dass Sie im gleichen Namensraum wie die einer normalen Klasse namespace wäre, wenn in dem Ordner erstellt wurde.
Blick auf MSDN-Referenz (Abschnitt "Weitergabe von Parametern im Konstruktor").
Zusammenfassen:
Erstellen Sie eine partielle Klasse mit dem gleichen Namen von Ihrem TT-Datei.
Dann einfach die Parameter übergeben, die im Konstruktor der Klasse
Herausgefunden. Für Interessenten finden Sie unter:
http://www.olegsych.com/2009/09/t4-preprocessed-text-templates/