Preprocessed Templates mit Referenzen im Text Template verwenden
Preprocessed Templates, zu Deutsch auch vorverarbeitete Textvorlage genannt, haben den Vorteil, dass sie keine feste Abhängigkeit zu Visual Studio besitzen. Sie können aber auch dazu genutzt werden, um den Output vor beliebigen Anpassungen zu schützen, damit bei Änderungen nicht immer wieder unliebsame Prozesse (Validierung ;-)) in Gang gesetzt werden.
Machen wir ein kleines Beispiel, um zu sehen, wie sich die Theorie von der Praxis unterscheiden kann.
Ich erstelle ein Preprocessed Template, dass ich in einem normalen Text Template verwenden will. Dieses benötigt für seine Aufgabe 2 zusätzliche Referenzen auf externe Assemblies. Füge ich die Referenz zu meinen Preprocessed Template hinzu und teste dieses Template in einer Konsolen-Anwendung, dann erhalte ich mit folgendem Code:
die Ausgabe:

- Abbildung 2 Erzeugter Testcode mit Hilfe eines Preprocessed Templates in einer Konsolenanwendung
Wenn ich innerhalb einer normalen Textvorlage dieses Ergebnis haben will, dann ist der Code hierfür ähnlich, nur dass die Assembly innerhalb der Textvorlage referenziert werden muss. Die nachfolgende Abbildung verdeutlicht dies:
Wie kommt die Fehlermeldung:
Running transformation: System.IO.FileNotFoundException: Could not load file or assembly 'StoryQGenerator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Das System kann die angegebene Datei nicht finden. File name: 'StoryQGenerator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' at T4PreProcessed._03_StoryQ.StoryQTestTemplate.TransformText()
zustande?
Erklären lässt sich dies auch nur mit der temp. AppDomain und die Folge davon, dass die abhängigen Assemblies aus diesem Grund nicht geladen werden. Eine Variante wäre jetzt diese Assemblies innerhalb der Textvorlage zu referenzieren. Wird dieser Ansatz gewählt, besteht das sporadische Funktionieren der Textvorlage, ähnlich der Serialisierungsausnahme bei parametrisierten Vorlagen.
Wie lässt sich das Problem aber mit den Preprocessed Templates in den Griff bekommen? Dazu ist es interessant zu wissen, dass T4 die DLL-Dateien innerhalb des GAC und im Public-Assembly Verzeichnis von Visual Studio durchsucht. In meinem Szenario kopiere ich die 2 DLL’s in den öffentlichen Ordner von Visual Studio. Dadurch können die Assemblies aufgelöst werden und komme zu folgendem Ergebnis:
Solange am Preprocessed Template entwickelt wird, ist es nicht ratsam, dieses innerhalb der Text Templates zu verwenden, da auch der Ansatz mit dem Öffentlichen Verzeichnis die DLL’s sperrt und erst wieder freigibt, wenn die jeweilige Solution geschlossen wurde.
Ist ein wenig speziell das Ganze, ob es wohl eine elegantere Lösung gibt?
- 0 Kommentar(e)






Mein Kommentar