Обращение к Visual Studio или другим основным приложениям из текстового шаблона T4
В текстовом шаблоне можно использовать методы и свойства, предоставленные узлом, на котором выполняется шаблон, например Visual Studio.
Это относится к обычным, а не предварительно обработанным текстовым шаблонам.
Получение адреса узла
Задайте значение hostspecific="true" в директиве template. Это позволяет использовать класс 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.
#>
Использование API-интерфейса Visual Studio
Если текстовый шаблон выполняется в Visual Studio, можно воспользоваться this.Host для доступа к службам, предоставляемым Visual Studio, а также любым загруженным пакетам и расширениям.
Задайте значение hostspecific="true" и выполните приведение this.Host к IServiceProvider.
В этом примере API-интерфейс Visual Studio, 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 |
Создан раздел |
Обратная связь от клиента. |