如何使用有形编辑器从单个T4模板创建多个输出文件?

我试着按照这个教程: http : //t4-editor.tangible-engineering.com/blog/how-to-generate-multiple-output-files-from-a-single-t4-template.html

与visual studio 2015(.Net 4.5)

错误示例项目: http : //www.filedropper.com/t4fail


我使用以下源创建了Template1.tt:

          

我从模板库中添加了TemplateFileManagerV2.1.ttinclude到我的项目。

然后我收到一个错误:

‘Microsoft.VisualStudio.TextTemplating.IDebugTextTemplatingEngine’在未引用的程序集中定义。 您必须添加对程序集“Microsoft.VisualStudio.TextTemplating.Interfaces.11.0,Version = 11.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a”的引用。

所以我添加了引用

C:\ WINDOWS \ Microsoft.NET \assembly\ GAC_MSIL \ Microsoft.VisualStudio.TextTemplating.11.0 \ v4.0_11.0.0.0__b03f5f7f11d50a3a \ Microsoft.VisualStudio.TextTemplating.11.0.dll

C:\ WINDOWS \ Microsoft.NET \assembly\ GAC_MSIL \ Microsoft.VisualStudio.TextTemplating.Interfaces.11.0 \ v4.0_11.0.0.0__b03f5f7f11d50a3a \ Microsoft.VisualStudio.TextTemplating.Interfaces.11.0.dll

我的项目,但没有任何改变。


错误在.ttinclude中的以下方法中

 public string GetTemplateContent(string templateName, TextTemplatingSession session) { string fullName = this.Host.ResolvePath(templateName); string templateContent = File.ReadAllText(fullName); var sessionHost = this.Host as ITextTemplatingSessionHost; sessionHost.Session = session; Engine engine = new Engine(); return engine.ProcessTemplate(templateContent, this.Host); } 

我用它替换了它

 public string GetTemplateContent(string templateName, TextTemplatingSession session) { string fullName = this.Host.ResolvePath(templateName); string templateContent = File.ReadAllText(fullName); var sessionHost = this.Host as ITextTemplatingSessionHost; sessionHost.Session = session; //Engine engine = new Engine(); return "";//engine.ProcessTemplate(templateContent, this.Host); } 

检查问题是否确实在dll中并得到:

“Microsoft.VisualStudio.TextTemplatingA30AC8B57EFC4307E43667FCD72F5E4857F498C5224AE0D43FFC74B3A98D4FA090794EF196648D62B1BC664AFBA5EDE831067D7D1768A759EBBE83426975F7AA.GeneratedTextTransformation”不包含“主机”,没有扩展方法“主机”接受型“Microsoft.VisualStudio.TextTemplatingA30AC8B57EFC4307E43667FCD72F5E4857F498C5224AE0D43FFC74B3A98D4FA090794EF196648D62B1BC664AFBA5EDE831067D7D1768A759EBBE83426975F7AA.GeneratedTextTransformation”的第一个参数的定义可以找到(是否缺少using指令或汇编参考?)

看来,事实并非如此。

我记得我在2010年找到了一种更简单的方法,但现在,在浏览了该方法的网页后,我再也找不到了。 因此,经过一些挖掘,我设法在一个旧的源代码库中找到它。 这是我当时的做法,没有使用任何外部文件或依赖:

 <#@ template debug="false" hostspecific="true" language="C#" #> <#@ assembly name="System.Core" #> <#@ import namespace="System" #> <#@ import namespace="System.IO" #> <#@ output extension=".txt" #> <# for (Int32 i = 0; i < 10; ++i) { #> Content <#= i #> <# // End of file. SaveOutput("Content" + i.ToString() + ".txt"); } #> <#+ private void SaveOutput(string outputFileName) { string templateDirectory = Path.GetDirectoryName(Host.TemplateFile); string outputFilePath = Path.Combine(templateDirectory, outputFileName); File.WriteAllText(outputFilePath, this.GenerationEnvironment.ToString()); this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length); } #> 

请注意,我不知道这个方法的原作者是谁。 如果您碰巧知道他或她是谁,请发表评论。

<#@ template hostSpecific="true"#>

.tt文件的顶部解决了一切。