从 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 月

创建了主题

客户反馈