T4-Vorlage und Laufzeitparameter

8

Ich baue ein Plug-in in VS 2010 und ich bleibe bei der T4-Generation stecken. Im Moment habe ich (wie MSDN vorgeschlagen hat) einen benutzerdefinierten T4-Host implementiert, um meine T4-Ergebnisse zu generieren, und ich benutze es auf diese Weise:

%Vor%

Dies funktioniert, bis ich einen Parameter in der Vorlage übergeben habe. Sobald ich einen Parameter in der .tt-Datei erstelle, flippt der Host aus und sagt, dass er nicht weiß, wie er es lösen soll. Ich habe gesehen, dass Sie die TemplateSession verwenden können, aber ich habe nicht herausgefunden, wie ich sie an meinen Host weitergeben kann. Gibt es eine bessere Möglichkeit zum Generieren von Code aus einem .tt mit C # und Übergabe von Parametern zur Laufzeit? Vielleicht bin ich auf dem falschen Weg.

    
Raffaeu 09.12.2010, 19:00
quelle

6 Antworten

12

In Visual Studio 2010 wurde die T4-Vorlagen-Engine grundlegend geändert. Jetzt können Sie direkt eine Vorlagendatei ausführen und an einen beliebigen gewünschten -Typ übergeben.

%Vor%

Diese Anweisung wird die folgende Vorlage verarbeiten:

%Vor%

Also ehrlich gesagt wird der Host nicht mehr wirklich benötigt ...

    
Raffaeu 10.12.2010 12:36
quelle
7

Wenn Sie ein Add-In für VS erstellen, benötigen Sie wahrscheinlich keinen benutzerdefinierten Host, sondern können stattdessen den integrierten VS-Host über seine Service-Schnittstelle verwenden.

Sehen Sie sich ITextTemplating als Hauptdienst-API an. Dies können Sie erreichen, indem Sie Ihr DTE-Objekt in einen IServiceProvider umwandeln und dann GetService (typeof (STextTemplating))

aufrufen

Um Parameter zu übergeben, können Sie das ITextTemplating-Objekt dann zu ITextTemplatingSessionHost und setzen Sie die Session-Eigenschaft auf eine Implementierung von ITextTemplatingSession . Eine Sitzung ist im Wesentlichen nur eine serialisierbare Eigenschaftstasche. Es gibt eine einfache als TextTemplatingSession .

    
GarethJ 13.01.2011 02:52
quelle
7

Fügen Sie den ITextTemplatingSessionHost zu Ihrem benutzerdefinierten Host hinzu und implementieren Sie ihn. Wenn Sie ITextTemplatingEngineHost implementieren, erhalten Sie keine Sitzungsunterstützung.

%Vor%     
Daniel Pamich 11.01.2012 16:37
quelle
4

Verwenden von T4-Vorlagen zur Laufzeitgenerierung

  1. Sie wählen diese Methode, wenn Sie zur Laufzeit Code generieren müssen. Zum Beispiel möchten Sie ein Page-Objekt mit Selenium generieren.

  2. Erstellen Sie einen Ordner in Ihrer Lösung, nennen Sie ihn Templates (guter Name für T4 Vorlagen).

  3. Als nächstes fügen Sie ein neues Element vom Typ T4 hinzu und wählen dann die Option     Runtime Text Template .... Wir haben unsere Vorlage MyNodeName.tt genannt, die im Bild oben zu sehen ist.

  4. Fügen Sie Ihren Code wie unten gezeigt hinzu, der obere Teil wurde von Visual Studio eingefügt ...

Sie können sehen, dass wir den Namespace und den ClassName (das sind die Model.NameSpaceName und Model.ClassName Markups, die oben gesehen wurden) übergeben wollen.

Der schwierige Teil ist zu lernen, wie die Parameter übergeben werden ...

Erstellen Sie eine neue CS-Klasse mit dem Namen partially im Dateinamen.

Aber in der Klasse nennen Sie es nicht MyNodeNamePartial nennen Sie MyNodeName wie folgt:

%Vor%

Dies ist derselbe Name wie die TT-Datei. (MyNodeName), der seine eigene partielle Klasse erstellt. Aber jetzt bemerken wir haben einen Wert namens MODEL dieser Klasse ..

%Vor%

Die Modellklasse enthält ClassName und NameSpaceName und alles, was Sie in die Vorlage "injizieren" möchten.

Der Schlüssel zum Arbeiten funktioniert wie gezeigt , ist, dass das Runtime Text Template verwendet wurde! Wenn Sie eine Textvorlage verwenden, sehen Sie unabhängig davon, was Sie tun, ähnliche Fehler wie "Modell nicht gefunden" oder andere mehrdeutige Probleme.

Debugging-Tipps:   "Das Modell kann nicht gefunden werden" ist der T4-Generierungscode, der Ihnen mitteilt, dass er in Ihrer Teilklasse mit der Variablen MODEL nicht gefunden werden kann! Überprüfen Sie sowohl Ihre Teil- als auch die Modelltypen, um sicherzustellen, dass sie sich in demselben Namespace befinden wie jeder andere normale Klassennamespace, wenn er in diesem Ordner erstellt würde.

    
John Peters 12.04.2016 22:06
quelle
1

Sehen Sie sich die MSDN-Referenz an (Abschnitt "Parameter im Konstruktor übergeben").

Zusammenfassend:

Erstellen Sie eine Teilklasse mit dem gleichen Namen Ihrer TT-Datei.

%Vor%

Übergeben Sie einfach Ihre Parameter im Konstruktor der Klasse

%Vor%     
alexbchr 11.07.2014 12:35
quelle
0

Ich habe es herausgefunden. Für Interessierte sehen Sie folgendes:

Ссылка

    
dezrtluver 12.06.2011 22:54
quelle