2015-11-06 21 views
1

我試圖按照本教程:http://t4-editor.tangible-engineering.com/blog/how-to-generate-multiple-output-files-from-a-single-t4-template.html如何使用有形編輯器從單個T4模板創建多個輸出文件?

與Visual Studio 2015年(.NET 4.5),誤差

示例項目:http://www.filedropper.com/t4fail


我創建了Template1.tt與下面的源:

<#@ include file="TemplateFileManagerV2.1.ttinclude" #> 
<#@ Assembly Name="System.Core" #> 
<#@ Assembly Name="System.Windows.Forms" #> 
<#@ import namespace="System" #> 
<#@ import namespace="System.IO" #> 
<#@ import namespace="System.Diagnostics" #> 
<#@ import namespace="System.Linq" #> 
<#@ import namespace="System.Collections" #> 
<#@ import namespace="System.Collections.Generic" #> 
<# 
    var manager = TemplateFileManager.Create(this); 
#> 

我將TemplateFileManagerV2.1.ttinclude從模板庫添加到我的項目。

然後,我得到了一個錯誤:

'Microsoft.VisualStudio.TextTemplating.IDebugTextTemplatingEngine' is defined in an assembly that is not referenced. You must add a reference to assembly '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' does not contain a definition for 'Host' and no extension method 'Host' accepting a first argument of type 'Microsoft.VisualStudio.TextTemplatingA30AC8B57EFC4307E43667FCD72F5E4857F498C5224AE0D43FFC74B3A98D4FA090794EF196648D62B1BC664AFBA5EDE831067D7D1768A759EBBE83426975F7AA.GeneratedTextTransformation' could be found (are you missing a using directive or an assembly reference?)

看來,它不是。

+0

這個錯誤幾乎告訴你問題是什麼以及你需要做什麼..每當它聲明使用指令或程序集引用無法找到時,你需要做以下2件事情。確保'1'將一個using指令添加到.cs文件頭'2'中,手動將.dll添加到項目中的引用節點。如果您正在部署,請確保您在參考節點= true中設置了dll的'CopyLocal'屬性。 – MethodMan

+0

沒有.cs文件。 有<#@ import namespace =「Microsoft.VisualStudio.TextTemplating」#>指令排在.ttinclude之上 有Microsoft.VisualStudio.TextTemplating。項目引用的Interfaces.11.0.dll。 錯誤仍然存​​在。 (如果你是第一個) – user2136963

回答

2

<#@ template hostSpecific="true"#>

.tt文件的頂部解決一切問題。

3

我記得我在2010年發現了一個更簡單的方法,但現在,在通過Web查看該方法後,我再也找不到它了。因此,經過一番挖掘,我設法在舊的源代碼庫中找到它。這裏是我是如何做到的當時,未做使用任何外部文件或依賴:

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

請注意,我不知道這種方法的原作者是誰。如果你碰巧知道他是誰,請留下評論。

相關問題