我正在尝试编写一个控制台程序,它将 T4 模板的文件名作为参数,然后处理该模板。这是因为我希望用户能够更新模板而无需重新编译程序。
我找到的最简单的解决方案是在 Visual Studio 中创建第二个模板,该模板预编译为 C# 类,然后执行我的外部模板“Template.tt”:
<#@ template language="C#" hostspecific="True" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
<#
string template = File.ReadAllText(Host.ResolvePath("Template.tt"));
Engine engine = new Engine();
string output = engine.ProcessTemplate(template, Host);
Write(output);
#>
在我的控制台程序的 Program.cs 中,我然后执行这个“调用”模板:
string templateText = new Caller().TransformText();
问题是当我运行这个 (F5) 时,它会在调用者模板的第一行抛出 NullReferenceException,因为 Host 为空。
但是,我认为将 hostspecific 设置为 True 会给我一个 Host。
我需要做什么才能获得主机?真的不想自己动手。或者,是否有更好的方法来执行外部 T4 模板?