Freigeben über


Zugreifen auf Visual Studio oder andere Hosts von einer T4-Textvorlage

In einer Textvorlage können Sie Methoden und Eigenschaften verwenden, die vom Host verfügbar gemacht werden, der die Vorlage ausführt, z. B. Visual Studio.

Dies gilt für reguläre Textvorlagen, jedoch nicht für vorverarbeitete Textvorlagen.

Erhalten von Zugriff auf den Host

Legen Sie hostspecific="true" in der template-Direktive fest. Damit können Sie this.Host verwenden, das den Typ ITextTemplatingEngineHost aufweist. Dieser Typ verfügt über Member, die Sie verwenden können, z. B., um Dateinamen aufzulösen und Fehler zu protokollieren.

Auflösen von Dateinamen

Um den vollständigen Pfad einer Datei relativ zur Textvorlage zu suchen, verwenden Sie 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 #>

Anzeigen von Fehlermeldungen

In diesem Beispiel werden Meldungen protokolliert, wenn die Vorlage transformiert wird. Wenn der Host Visual Studio ist, werden sie dem Fehlerfenster hinzugefügt.

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

Verwenden der Visual Studio-API

Wenn Sie eine Textvorlage in Visual Studio ausführen, können Sie mit this.Host auf Dienste zugreifen, die von Visual Studio und allen geladenen Paketen oder Erweiterungen bereitgestellt werden.

Legen Sie hostspecific="true" fest, und wandeln Sie this.Host in IServiceProvider um.

In diesem Beispiel wird die Visual Studio-API, DTE, als Dienst abgerufen:

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

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

März 2011

Thema erstellt

Kundenfeedback.