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