使用参数指令时T4模板NullReferenceException

时间:2017-11-07 16:58:53

标签: c# visual-studio-2017 t4

我正在尝试实现可以​​处理T4模板的应用程序。

我已经实现了自定义文本模板主机,如本文所示: https://msdn.microsoft.com/en-us/library/bb126579.aspx

我可以运行这样一个简单的模板,它可以与C#代码和include指令一起使用:

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

但是,只要我尝试使用“参数”指令,我就会得到一个NullReferenceException。

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

运行模板的代码如下所示:

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);

我怀疑参数值永远不会传输到引擎中,所以问题是:

如何将参数值传输到引擎?

我发现this question使用host.Initialize();,但这似乎适用于预编译模板,Initialize方法未在示例文章中实现。 CreateSession();我没有像那篇文章中所描述的那样实现它。

P.S。 为了使文章中的代码生效,我必须添加Nuget包Microsoft.CodeAnalysis,此外还要将所提及的引用添加到Microsoft.VisualStudio.TextTemplating.15.0Microsoft.VisualStudio.TextTemplating.Interfaces.15.0

我正在使用VS2017。目标框架:.Net Framework 4.6.2

1 个答案:

答案 0 :(得分:1)

除了ITextTemplatingSessionHost之外,您还需要实现ITextTemplatingEngineHost界面。班级签名必须是

public class CustomCmdLineHost : ITextTemplatingEngineHost, ITextTemplatingSessionHost