Wywoływanie przekształcenia tekstu w rozszerzeniu programu Visual Studio

Jeśli piszesz rozszerzenie programu Visual Studio, takie jak polecenie menu lub język specyficzny dla domeny, możesz użyć usługi tworzenia szablonów tekstu do przekształcania szablonów tekstu. Pobierz usługę STextTemplating i oddaj ją do elementu ITextTemplating.

Pobieranie usługi tworzenia szablonów tekstu

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

Przekazywanie parametrów do szablonu

Parametry można przekazać do szablonu. Wewnątrz szablonu można pobrać wartości parametrów przy użyciu <#@parameter#> dyrektywy .

Jeśli chodzi o typ parametru należy użyć typu, który jest możliwy do serializacji lub który może być organizowany. Oznacza to, że typ musi być zadeklarowany za pomocą SerializableAttributemetody lub musi pochodzić z MarshalByRefObjectklasy . To ograniczenie jest konieczne, ponieważ szablon tekstowy jest wykonywany w oddzielnym elemencie AppDomain. Wszystkie wbudowane typy, takie jak System.String i System.Int32 , można serializować.

Aby przekazać wartości parametrów, kod wywołujący może umieścić wartości w słowniku Session lub w obiekcie CallContext.

W poniższym przykładzie użyto obu tych metod, aby przekształcić krótki szablon tekstowy:

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

Raportowanie błędów i dyrektywa wyjściowa

Wszelkie błędy występujące podczas przetwarzania zostaną wyświetlone w oknie błędu programu Visual Studio. Ponadto można otrzymywać powiadomienia o błędach, określając wywołanie zwrotne implementujące wywołanie zwrotne ITextTemplatingCallback.

Jeśli chcesz napisać ciąg wynikowy do pliku, możesz chcieć wiedzieć, jakie rozszerzenie pliku i kodowanie zostały określone w <#@output#> dyrektywie w szablonie. Te informacje również zostaną przekazane do wywołania zwrotnego. Aby uzyskać więcej informacji, zobacz Dyrektywa T4 Output.

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

Kod może być testowany z plikiem szablonu, podobnym do następującego:

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

Ostrzeżenie kompilatora zostanie wyświetlone w oknie błędu programu Visual Studio i spowoduje również wygenerowanie wywołania polecenia ErrorCallback.

Parametry odwołania

Wartości z szablonu tekstowego można przekazać przy użyciu klasy parametrów pochodzącej z MarshalByRefObjectklasy .

Aby wygenerować tekst na podstawie wstępnie przetworzonego szablonu tekstu: wywołaj TransformText() metodę wygenerowanej klasy. Aby uzyskać więcej informacji, zobacz Generowanie tekstu w czasie wykonywania przy użyciu szablonów tekstu T4.

Aby wygenerować tekst poza rozszerzeniem programu Visual Studio: zdefiniuj hosta niestandardowego. Aby uzyskać więcej informacji, zobacz Przetwarzanie szablonów tekstu przy użyciu hosta niestandardowego.

Aby wygenerować kod źródłowy, który można później skompilować i wykonać: wywołaj metodę PreprocessTemplate elementu ITextTemplating.