Sdílet prostřednictvím


Vyvolání transformace textu v rozšíření sady Visual Studio

Pokud píšete rozšíření sady Visual Studio, například příkaz nabídky nebo jazyk specifický pro doménu, můžete k transformaci textových šablon použít službu šablon textu. Získejte službu STextTemplating a přetypujte ji na ITextTemplating.

Získání služby šablon textu

using Microsoft.VisualStudio.TextTemplating;
using Microsoft.VisualStudio.TextTemplating.VSHost;
...
// Get a service provider - how you do this depends on the context:
IServiceProvider serviceProvider = ...; // An instance of EnvDTE, for example

// 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));

Předání parametrů do šablony

Do šablony můžete předávat parametry. Uvnitř šablony můžete získat hodnoty parametrů pomocí direktivy <#@parameter#> .

Jako typ parametru je nutné použít typ, který lze serializovat nebo zařadit. To znamená, že typ musí být deklarován s SerializableAttribute, nebo musí být odvozen z MarshalByRefObject. Toto omezení je nezbytné, protože textová šablona se vykonává v samostatné doméně AppDomain. Všechny předdefinované typy, jako je System.String a System.Int32 , jsou serializovatelné.

K předání hodnot parametrů může volající kód umístit hodnoty buď do slovníku Session , nebo do CallContext.

Následující příklad používá obě metody k transformaci krátké testovací šablony:

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

Hlášení chyb a direktiva výstupu

Všechny chyby, ke kterým dojde během zpracování, se zobrazí v okně chyby sady Visual Studio. Kromě toho můžete být upozorněni na chyby zadáním zpětného volání, který implementuje ITextTemplatingCallback.

Pokud chcete napsat výsledný řetězec do souboru, možná budete chtít vědět, jaké přípony souboru a kódování byly zadány v <#@output#> direktivě v šabloně. Tyto informace budou do zpětného volání rovněž předány. Další informace naleznete v tématu T4 Výstupní direktiva.

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; }
}

Kód lze testovat pomocí souboru šablony, který je podobný následujícímu:

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

Upozornění kompilátoru se zobrazí v okně chyby sady Visual Studio a také vygeneruje volání ErrorCallback.

Parametry odkazu

Hodnoty z textové šablony můžete předat pomocí třídy parametru, která je odvozena z MarshalByRefObject.

Generování textu z předzpracované textové šablony: Volejte TransformText() metodu vygenerované třídy. Další informace najdete v tématu Generování textu za běhu pomocí textových šablon T4.

Generování textu mimo rozšíření sady Visual Studio: Definujte vlastního hostitele. Další informace naleznete v tématu Zpracování textových šablon pomocí vlastního hostitele.

Chcete-li vygenerovat zdrojový kód, který lze později zkompilovat a provést: Volání PreprocessTemplate metoda ITextTemplating.