从 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 月 |
创建了主题 |
客户反馈 |