Condividi tramite


Accesso a Visual Studio o altri host da un modello di testo T4

In un modello di testo, è possibile utilizzare i metodi e le proprietà esposti dall'host che esegue il modello, ad esempio Visual Studio.

Questo vale per i modelli di testo normali, non per i modelli di testo pre-elaborati.

Come ottenere l'accesso all'host

Impostare hostspecific="true" nella direttiva template. Consente di utilizzare this.Host di tipo ITextTemplatingEngineHost. Questo tipo dispone di membri che è possibile utilizzare ad esempio per risolvere nomi di file e per registrare errori.

Risoluzione di nomi di file

Per trovare il percorso completo di un file relativo al modello di testo, utilizzare 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 #>

Visualizzazione dei messaggi di errore

In questo esempio vengono registrati i messaggi quando il modello viene trasformato. Se l'host è Visual Studio, i messaggi vengono aggiunti alla finestra di errore.

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

Utilizzo dell'API di Visual Studio

Se si esegue un modello di testo in Visual Studio, è possibile utilizzare this.Host per accedere ai servizi forniti da Visual Studio e a qualsiasi pacchetto o estensione caricati.

Impostare hostspecific = "true" e cast this.Host su IServiceProvider.

In questo esempio viene ottenuta l'API di Visual Studio, DTE come servizio:

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

Cronologia delle modifiche

Data

Cronologia

Motivo

Marzo 2011

Creato argomento

Commenti e suggerimenti dei clienti.