Acessando Visual Studio ou outros Hosts a partir de um modelo de texto T4

Em um modelo de texto, você pode usar os métodos e propriedades expostas pelo host que executa o modelo, como Visual Studio.

Isso se aplica aos modelos de texto normal, os modelos de texto não pré-processado.

Como obter acesso ao host

Definir hostspecific="true" na template diretiva. Isso permite que você use this.Host, que tem o tipo de ITextTemplatingEngineHost. Esse tipo tem membros que você pode usar, por exemplo, para resolver nomes de arquivo e registro de erros.

Resolução de nomes de arquivo

Para localizar o caminho completo de um arquivo em relação ao modelo de texto, use esta opção.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 #>

Exibindo mensagens de erro

Este exemplo registra mensagens quando você transforma o modelo. Se o host for Visual Studio, eles são adicionados à janela de erro.

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

Usando a API de Visual Studio

Se estiver executando um modelo de texto em Visual Studio, você pode usar this.Host para acessar os serviços fornecidos por Visual Studio e quaisquer pacotes ou as extensões estão carregadas.

Definir hostspecific = "true" e reforço de this.Host para [T:System.IServiceProvider.]

Este exemplo obtém o Visual Studio API, DTE, como um serviço:

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

Histórico de alterações

Date

History

Motivo

Março de 2011

Tópico criado

Comentários do cliente.