04.11.2010
23:38

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:

Abbildung 1
Abbildung 1 Initialisierung und Ausgabe des Preprocessed Templates in einer Konsolenanwendung

die Ausgabe:

Abbildung 2
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:

Abbildung 3
Abbildung 3 Initialisierung und Ausgabe des Preprocessed Templates in einer Textvorlage

Das Ergebnis ist jedoch nicht die Ausgabe des zu erzeugenden Test, sondern eine Fehlermeldung:

Abbildung 4
Abbildung 4 Fehlermeldung das referenzierte Assemblies nicht gefunden worden sind

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:

Abbildung 5
Abbildung 5 Ausgabe des Preprocessed Templates bei der korrekten Auflösung der Assemblies

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

Über jeden weiteren Kommentar in diesem Post benachrichtigen.

Zurück

Translate this page

Kategorien

  • [-].NET Development (215)
  • [-]Datenbank (26)
  • HTML (1)
  • Konfiguration (12)
  • Mind Map (10)
  • Off-topic (9)
  • Open Source (3)
  • Qualität (7)
  • Sharepoint (6)
  • Sicherheit (2)

Archiv

Social Bookmarking

Bookmark bei: Mr. Wong Bookmark bei: Webnews Bookmark bei: Icio Bookmark bei: Oneview Bookmark bei: Linkarena Bookmark bei: Favoriten Bookmark bei: Seekxl Bookmark bei: Favit Bookmark bei: Social Bookmarking Tool Bookmark bei: Power Oldie Bookmark bei: Bookmarks.cc Bookmark bei: Newskick Bookmark bei: Newsider Bookmark bei: Linksilo Bookmark bei: Readster Bookmark bei: Folkd Bookmark bei: Yigg Bookmark bei: Digg Bookmark bei: Del.icio.us Bookmark bei: Reddit Bookmark bei: Simpy Bookmark bei: StumbleUpon Bookmark bei: Slashdot Bookmark bei: Netscape Bookmark bei: Furl Bookmark bei: Yahoo Bookmark bei: Spurl Bookmark bei: Google Bookmark bei: Blinklist Bookmark bei: Blogmarks Bookmark bei: Diigo Bookmark bei: Technorati Bookmark bei: Newsvine Bookmark bei: Blinkbits Bookmark bei: Ma.Gnolia Bookmark bei: Smarking Bookmark bei: Netvouz Information