Tener acceso a Visual Studio u otros hosts desde una plantilla de texto T4

En una plantilla de texto, puede utilizar los métodos y propiedades expuestas por el host que ejecuta la plantilla, como Visual Studio.

Esto se aplica a las plantillas de texto normales, no a las plantillas de texto preprocesadas.

Obtener acceso al host

Establezca hostspecific="true" en la directiva template. Esto permite utilizar this.Host, que tiene el tipo ITextTemplatingEngineHost. Este tipo tiene miembros que se pueden utilizar, por ejemplo, para resolver nombres de archivo y registro de errores.

Resolver nombres de archivo

Para encontrar la ruta de acceso completa de un archivo relativo a la plantilla de texto, utilice 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 #>

Mostrar mensajes de error

Este ejemplo registra los mensajes cuando se transforma la plantilla. Si el host es Visual Studio, se agregan a la ventana de error.

<#@ 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.
#>

Usar la API de Visual Studio

Si está ejecutando una plantilla de texto en Visual Studio, puede utilizar this.Host para obtener acceso a los servicios proporcionados por Visual Studio y a cualquier paquete o extensiones que se cargan.

Establezca hostspecific="true" y realice la conversión de this.Host a IServiceProvider.

En este ejemplo se obtiene la API de Visual Studio, DTE, como un servicio:

<#@ 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 #>

Historial de cambios

Fecha

Historial

Motivo

Marzo de 2011

Tema creado

Comentarios de los clientes.