Udostępnij za pośrednictwem


Wywoływanie transformacji tekstu w rozszerzeniu VS

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

Pobieranie usługi szablonów tekstowych

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 uzyskać wartości parametru za pomocą dyrektywy <#@parameter#>.

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 z SerializableAttribute lub musi pochodzić z MarshalByRefObject.To ograniczenie jest konieczne, ponieważ szablon tekstowy jest wykonywany w oddzielnym elemencie AppDomain.Wszystkie typy wbudowane, takie jak System.String i System.Int32, można serializować.

Aby przekazać wartości parametru, kod wywołujący może umieścić wartości albo w słowniku Session, albo w 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 powstałe podczas przetwarzania będą wyświetlane w oknie błędów Visual Studio.Ponadto, użytkownik może zostać poinformowany o błędach, określając wywołanie zwrotne, które implementuje ITextTemplatingCallback.

Jeśli chcesz zapisać ciąg wyniku do pliku, warto wiedzieć, jakie rozszerzenie pliku i kodowanie określono w dyrektywie <#@output#> 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 pojawi się w oknie błędów Visual Studio, a także wygeneruje wywołanie ErrorCallback.

Parametry odwołania

Wartości z szablonu tekstu można przekazać za pomocą parametru klasy, która jest pochodną MarshalByRefObject.

Tematy pokrewne