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
Ausgezeichnet sein. Es war der fehlende ITextTemplatingSessionHost, der es löste. Vielen Dank für Ihre Hilfe. – TechnoCowboy