Почему мой код Visual Studio T4 выводит ошибку? - PullRequest
2 голосов
/ 09 января 2011

Следуя инструкциям здесь 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 Ответ

3 голосов
/ 02 февраля 2011

В примерах Олега используются два шаблона. Один содержит метод, а второй импортирует его для вызова методов.

Из справочного примера:

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

Этот шаблон также включает специфическую для хоста опцию для генерации свойства Host. Метод ProcessTemplate использует это свойство для определения полного пути к автономному файлу шаблона, а также к выходному каталогу. Метод ProcessTemplate создает новый экземпляр класса T4 Engine, который он использует для компиляции и запуска автономного шаблона.

Вот шаблон, который использует этот вспомогательный метод для генерации двух выходных файлов из двух автономных шаблонов. "(Текст из примера справки)

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

Это первый шаблон, на который есть ссылка в примере справки. Если вы укажете полученную ошибку, это поможет при отладке.

...