Поделиться через


Обращение к 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

Создан раздел

Обратная связь от клиента.