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