2017-11-07 1 views
1

Ich versuche, eine Anwendung zu implementieren, die T4-Vorlagen verarbeiten kann.T4-Vorlage NullReferenceException bei Verwendung der Parameter-Direktive

ich einen Custom Text Template-Host implementiert habe wie in diesem Artikel gezeigt: https://msdn.microsoft.com/en-us/library/bb126579.aspx

ich eine einfache Vorlage wie diese ausgeführt werden kann, und es funktioniert sowohl mit C# -Code in Ordnung und die Include-Direktive:

<#@ template debug="true" #> 
    <#@ include file="includehello.txt" #> 
    Some text. 
    <# for(int i = 0; i < 3; i++) { #> 
     //Line <#= i #> 
    <# } #> 

Aber sobald ich versuche, die "Parameter" -Richtlinie zu verwenden, bekomme ich eine NullReferenceException.

<#@ template debug="true" #> 
    <#@ parameter type="System.String" name="worldParam" #> 
    Hello <#=worldParam#> 

Der Code, der die Vorlage läuft wie folgt aussieht:

CustomCmdLineHost host = new CustomCmdLineHost(); 
Engine engine = new Engine(); 
host.TemplateFileValue = "HelloWorldTemplate.tt";   
//Read the text template. 
string input = File.ReadAllText(templateFileName); 
host.Session = host.CreateSession();   
// Add parameter values to the Session: 
host.Session["worldParam"] = "world"; 
//Transform the text template. 
string output = engine.ProcessTemplate(input, host); 
//Save the result 
string outputFileName = Path.GetFileNameWithoutExtension(templateFileName); 
outputFileName = Path.Combine(Path.GetDirectoryName(templateFileName), outputFileName); 
outputFileName = outputFileName + "1" + host.FileExtension; 
File.WriteAllText(outputFileName, output, host.FileEncoding); 

Ich vermute, dass die Parameterwerte nicht in den Motor übertragen werden, so ist die Frage:

Wie übertrage ich Parameterwerte zum Motor?

Ich fand this question, die verwendet, aber das scheint für vorkompilierte Vorlagen zu sein, und die Initialize Methode ist nicht im Beispielartikel implementiert. Weder ist die CreateSession(); ich implementiert, wie in diesem Artikel beschrieben.

P.S. Um den Code aus dem Artikel zu arbeiten, musste ich das Nuget-Paket Microsoft.CodeAnalysis hinzufügen, zusätzlich zu den genannten Referenzen Microsoft.VisualStudio.TextTemplating.15.0 und Microsoft.VisualStudio.TextTemplating.Interfaces.15.0 hinzufügen.

Ich verwende VS2017. Zielgerüst: .Net Framework 4.6.2

Antwort

1

Sie müssen ITextTemplatingSessionHost Schnittstelle zusätzlich zu ITextTemplatingEngineHost implementieren. Die Klassensignatur muss

public class CustomCmdLineHost : ITextTemplatingEngineHost, ITextTemplatingSessionHost 
+0

Ausgezeichnet sein. Es war der fehlende ITextTemplatingSessionHost, der es löste. Vielen Dank für Ihre Hilfe. – TechnoCowboy

Verwandte Themen