2013-05-21 31 views
0

我正在嘗試編寫一個控制檯程序,它將T4模板的文件名作爲參數,然後處理該模板。這是因爲我希望用戶能夠更新模板而不必重新編譯程序。執行T4模板:主機爲null,而hostspecific =「True」

,我發現最簡單的方法是創建一個預編譯的C#類,後者又執行我的外部模板「Template.tt」 Visual Studio中第二個模板:

<#@ 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,因爲主機爲null。

但是,我認爲將hosts設置爲True會給我一個主機。

我需要做什麼來獲得主機?真的不想要推出自己的。 或者,有沒有更好的方法來執行外部T4模板?

回答

0

根據MSDN documentation,hostspecific屬性僅提供對t4模板內部的Host-Property的訪問。它不保證主機的存在。對於設計時模板(在visual studio中進行轉換),Visual Studio和它的T4引擎提供了該主機。不幸的是,Microsoft.VisualStudio.TextTemplating.dll不是可再分發的程序集。所以你不會在運行時場景中擁有該主機。

正如你所說,你需要寫一個完整的T4發動機和舉辦自己......

如果用戶需要寫/改變T4模板,他們對編程和書寫文本模板知識。你能想出一種方法讓他們以任何方式使用視覺工作室嗎?或者(如果這些用戶所做的更改很小),您可以嘗試使用可在其他輸入(xml-file,ini-file,command-line-parameters,...)上工作的預編譯模板。

對不起,我沒有更好的消息...

0

實際的自定義(基於命令行應用程序)T4主機並不太難實現,我不記得了我的頭,我得到了代碼,但在這裏是我們的T4模塊化的控制檯應用程序亞軍的鏈接: https://github.com/abstractiondev/absbuilder

實際的命令行的主機是在這裏: https://github.com/abstractiondev/absbuilder/blob/master/AbstractionBuilder/CustomCmdLineHost.cs

對於引用T4部分,我們已經跑了單聲道運行/ MonoDevelop的環境中的工具在Linux中,現在基於在測試中(即1 - 2年前),我記得MonoDevelop的T4是完全兼容的,並提供一些非常明智的授權(如果我正確記得,麻省理工學院或Apache 2.0)的源代碼。