Freigeben über


Aufrufen von Texttransformation in einer VS-Erweiterung

Wenn Sie eine Visual Studio-Erweiterung wie einen Menübefehl oder eine domänenspezifische Sprache schreiben, können Sie Textvorlagen mithilfe des Textvorlagendiensts transformieren. Sie benötigen den STextTemplating-Dienst, der in ITextTemplating umgewandelt werden muss.

Erhalt des Textvorlagendiensts

using Microsoft.VisualStudio.TextTemplating;
using Microsoft.VisualStudio.TextTemplating.VSHost;
...
// Get a service provider – how you do this depends on the context:
IServiceProvider serviceProvider = dte; 

// Get the text template service:
ITextTemplating t4 = serviceProvider.GetService(typeof(STextTemplating)) as ITextTemplating;

// Process a text template:
string result = t4.ProcessTemplate(filePath, System.IO.File.ReadAllText(filePath));

Übergeben von Parametern an die Vorlage

Sie können Parameter an die Vorlage übergeben. In der Vorlage können Sie die Parameterwerte mit der <#@parameter#>-Direktive abrufen.

Für einen Parameter muss ein Typ verwendet werden, der serialisierbar ist oder gemarshallt werden kann. Das heißt, der Typ muss mit SerializableAttribute deklariert werden, oder er muss sich von MarshalByRefObject ableiten. Diese Einschränkung ist notwendig, da die Textvorlage in einer separaten AppDomain ausgeführt wird. Alle integrierten Datentypen, z. B. System.String und System.Int32, sind serialisierbar.

Um Parameterwerte zu übergeben, können vom aufrufenden Code Werte entweder im Session-Wörterbuch oder im CallContext platziert werden.

Das folgende Beispiel transformiert mithilfe der beiden Methoden eine kurze Testvorlage:

using Microsoft.VisualStudio.TextTemplating;
using Microsoft.VisualStudio.TextTemplating.VSHost;
...
// Get a service provider – how you do this depends on the context:
IServiceProvider serviceProvider = dte; 

// Get the text template service:
ITextTemplating t4 = serviceProvider.GetService(typeof(STextTemplating)) as ITextTemplating;
ITextTemplatingSessionHost sessionHost = t4 as ITextTemplatingSessionHost;

// Create a Session in which to pass parameters:
sessionHost.Session = sessionHost.CreateSession();
sessionHost.Session["parameter1"] = "Hello";
sessionHost.Session["parameter2"] = DateTime.Now;

// Pass another value in CallContext:
System.Runtime.Remoting.Messaging.CallContext.LogicalSetData("parameter3", 42);

// Process a text template:
string result = t4.ProcessTemplate("",
   // This is the test template:
   "<#@parameter type=\"System.String\" name=\"parameter1\"#>"
 + "<#@parameter type=\"System.DateTime\" name=\"parameter2\"#>"
 + "<#@parameter type=\"System.Int32\" name=\"parameter3\"#>"
 + "Test: <#=parameter1#>    <#=parameter2#>    <#=parameter3#>");

// This test code yields a result similar to the following line:
//     Test: Hello    07/06/2010 12:37:45    42 

Fehlerbericht und Ausgabedirektive

Alle Fehler, die während der Verarbeitung auftreten, werden im Fehlerfenster von Visual Studio angezeigt. Außerdem können Sie über Fehler informiert werden, indem Sie einen Rückruf angeben, der ITextTemplatingCallback implementiert.

Wenn Sie die Ergebniszeichenfolge in eine Datei schreiben möchten, sind Sie möglicherweise daran interessiert, welche Dateierweiterung und welche Codierung in der <#@output#>-Direktive in der Vorlage angegeben wurden. Diese Informationen werden auch an den Rückruf übergeben. Weitere Informationen finden Sie unter T4 Output-Direktive.

void ProcessMyTemplate(string MyTemplateFile)
{
  string templateContent = File.ReadAllText(MyTemplateFile);
  T4Callback cb = new T4Callback();
  // Process a text template:
  string result = t4.ProcessTemplate(MyTemplateFile, templateContent, cb);
  // If there was an output directive in the MyTemplateFile,
  // then cb.SetFileExtension() will have been called.
  // Determine the output file name:
  string resultFileName = 
    Path.Combine(Path.GetDirectoryName(MyTemplateFile), 
        Path.GetFileNameWithoutExtension(MyTemplateFile)) 
      + cb.fileExtension;
  // Write the processed output to file:
  File.WriteAllText(resultFileName, result, cb.outputEncoding);
  // Append any error messages:
  if (cb.errorMessages.Count > 0)
  {
    File.AppendAllLines(resultFileName, cb.errorMessages);
  }
}

class T4Callback : ITextTemplatingCallback
{
  public List<string> errorMessages = new List<string>();
  public string fileExtension = ".txt";
  public Encoding outputEncoding = Encoding.UTF8;

  public void ErrorCallback(bool warning, string message, int line, int column)
  { errorMessages.Add(message); }

  public void SetFileExtension(string extension)
  { fileExtension = extension; }

  public void SetOutputEncoding(Encoding encoding, bool fromOutputDirective)
  { outputEncoding = encoding; }
}

Der Code kann mit einer Vorlagendatei getestet werden, die der folgenden Datei ähnelt:

<#@output extension=".htm" encoding="ASCII"#>
<# int unused;  // Compiler warning "unused variable"
#>
Sample text.

Die Compilerwarnung wird im Visual Studio-Fehlerfenster angezeigt, und es wird auch ein Aufruf von ErrorCallback generiert.

Verweisparameter

Sie können Werte aus einer Textvorlage mit einer Parameterklasse übergeben, die von MarshalByRefObject abgeleitet wird.

Verwandte Themen

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

März 2011

Thema erstellt

Informationsergänzung.