为什么我的Visual Studio T4代码输出错误?

时间:2011-01-09 19:08:58

标签: c# visual-studio t4

点击此处http://www.olegsych.com/2008/03/how-to-generate-multiple-outputs-from-single-t4-template/

我试图将var personName从test1.tt传递给template1.tt,但我看不到没有文件的原因?:

template1.tt

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".txt" #>
<#@ assembly name="System"#>

hello <#= personName #>

test1.tt

<#@ template language="C#" hostspecific="True" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
<#@ import namespace="System.Runtime.Remoting.Messaging" #>

            CallContext.SetData("template1.personName", "Baby");
            ProcessTemplate("template1.tt","testoutput.txt");

<#+
  void ProcessTemplate(string templateFileName, string outputFileName) {
    string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);
    string outputFilePath = Path.Combine(templateDirectory, outputFileName);  

    string template = File.ReadAllText(Host.ResolvePath(templateFileName));
    Engine engine = new Engine();
    string output = engine.ProcessTemplate(template, Host);  

    File.WriteAllText(outputFilePath, output);
  }
#>

1 个答案:

答案 0 :(得分:3)

Oleg的例子使用两个模板。一个用于保存方法,另一个用于导入方法以调用方法。

来自帮助示例:

ProcessTemplate.tt
<#@ template language="C#" hostspecific="True" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
<#+
  void ProcessTemplate(string templateFileName, string outputFileName)
  {
    string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);
    string outputFilePath = Path.Combine(templateDirectory, outputFileName);  

    string template = File.ReadAllText(Host.ResolvePath(templateFileName));
    Engine engine = new Engine();
    string output = engine.ProcessTemplate(template, Host);  

    File.WriteAllText(outputFilePath, output);
  }
#>

此模板还会打开hostspecific选项以生成Host属性。 ProcessTemplate方法使用此属性来确定独立模板文件以及输出目录的完整路径。 ProcessTemplate方法创建一个T4 Engine类的新实例,用于编译和运行独立模板。

这是一个模板,它使用这个帮助器方法从两个独立模板生成两个输出文件。“(来自帮助示例的文本)

 Example3.tt
    <#@ include file="ProcessTemplate.tt" #>
    <#
        ProcessTemplate("Standalone1.tt", "StandaloneOutput1.txt");
        ProcessTemplate("Standalone2.tt", "StandaloneOutput2.txt");
    #>

这是帮助示例中引用的第一个模板。如果您指定了错误,它将有助于调试。