從 T4 文字範本存取 Visual Studio 或其他主機
更新:2011 年 3 月
在文字範本中,您可以使用執行範本的主應用程式 (例如 Visual Studio) 所公開的方法和屬性。
這適用於一般文字範本,不適用於前置處理過的文字範本。
取得主機的存取權
在 template 指示詞中設定 hostspecific="true"。 這可讓您使用 this.Host,它有 ITextTemplatingEngineHost 型別。 這個型別的成員可用來,例如解析檔案名稱和記錄錯誤。
解析檔案名稱
若要尋找相對於文字範本的完整檔案路徑,請使用 this.Host.ResolvePath()。
<#@ template hostspecific="true" language="C#" #>
<#@ output extension=".txt" #>
<#@ import namespace="System.IO" #>
<#
// Find a path within the same project as the text template:
string myFile = File.ReadAllText(this.Host.ResolvePath("MyFile.txt"));
#>
Content of myFile is:
<#= myFile #>
顯示錯誤訊息
這個範例會在轉換範本時記錄訊息。 如果主應用程式為 Visual Studio,則會將錯誤訊息加入至錯誤視窗。
<#@ template hostspecific="true" language="C#" #>
<#@ output extension=".txt" #>
<#@ import namespace="System.CodeDom.Compiler" #>
<#
string message = "test message";
this.Host.LogErrors(new CompilerErrorCollection()
{ new CompilerError(
this.Host.TemplateFile, // Identify the source of the error.
0, 0, "0", // Line, column, error ID.
message) }); // Message displayed in error window.
#>
使用 Visual Studio API
如果在 Visual Studio 中執行文字範本,您可以使用 this.Host 存取 Visual Studio 所提供的服務,以及任何已載入的封裝或擴充功能。
設定 hostspecific="true",並將 this.Host 轉換成 IServiceProvider。
這個範例會以服務方式取得 Visual Studio API,DTE:
<#@ template hostspecific="true" language="C#" #>
<#@ output extension=".txt" #>
<#@ assembly name="EnvDTE" #>
<#@ import namespace="EnvDTE" #>
<#
IServiceProvider serviceProvider = (IServiceProvider)this.Host;
DTE dte = serviceProvider.GetService(typeof(DTE)) as DTE;
#>
Number of projects in this solution: <#= dte.Solution.Projects.Count #>
變更記錄
日期 |
記錄 |
原因 |
---|---|---|
2011 年 3 月 |
建立主題 |
客戶回函。 |