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
Aby wygenerować tekst ze wstępnie przetworzonego szablonu tekstu:
Wywołaj metodę TransformText() wygenerowanej klasy.Aby uzyskać więcej informacji, zobacz Generowanie tekstu czasu wykonywania przy użyciu szablonów tekstowych T4.Aby wygenerować tekst poza rozszerzeniem Visual Studio:
Zdefiniuj niestandardowego hosta.Aby uzyskać więcej informacji, zobacz Przetwarzanie szablonów tekstowych przy użyciu hosta niestandardowego.Aby wygenerować kod źródłowy, który później zostanie skompilowany i wykonany:
Wywołaj metodę t4.PreprocessTemplate()ITextTemplating.