Partager via


Accès à Visual Studio ou d'autres hôtes à partir d'un modèle de texte T4

Dans un modèle de texte, vous pouvez utiliser les méthodes et propriétés exposées par l'hôte qui exécute le modèle, comme Visual Studio.

Cela s'applique aux modèles de texte normaux, non prétraités.

Obtention de l'accès à l'hôte

Définissez hostspecific="true" dans la directive template. Cela vous permet d'utiliser this.Host, qui a le type ITextTemplatingEngineHost. Ce type possède des membres que vous pouvez utiliser, par exemple, pour résoudre des noms de fichiers et enregistrer les erreurs.

Résolution de noms de fichiers

Pour trouver le chemin complet d'un fichier par rapport au modèle de texte, utilisez 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 #>

Affichage de messages d'erreur

Cet exemple enregistre les messages lorsque vous transformez le modèle. Si l'hôte est Visual Studio, ils sont ajoutés à la fenêtre d'erreur.

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

Utilisation de l'API Visual Studio

Si vous exécutez un modèle de texte dans Visual Studio, vous pouvez utiliser this.Host pour accéder aux services fournis par Visual Studio et tous packages ou extensions chargés.

Définissez hostspecific="true" et effectuez le cast de this.Host en IServiceProvider.

Cet exemple obtient l'API Visual Studio, DTE, comme un service :

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

Historique des modifications

Date

Historique

Motif

Mars 2011

Rubrique créée

Commentaires client.