Volání transformací textu v rozšíření VS
Pokud píšete rozšíření pro Visual Studio, například příkaz nabídky nebo jazyk domény, můžete k transformaci textových šablon použít službu šablonování textu.Získejte službu STextTemplating a přetypujte ji na ITextTemplating.
Získání služby šablonování 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 lze hodnoty parametrů získat pomocí direktivy <#@parameter#>.
Jako typ parametru je nutné použít typ, který lze serializovat nebo zařadit.To znamená, že tento typ musí být deklarován pomocí SerializableAttribute nebo musí být odvozen od MarshalByRefObject.Toto omezení je nezbytné, protože textová šablona se vykonává v samostatné doméně AppDomain.Všechny předdefinované typy, jako System.String a System.Int32, jsou serializovatelné.
Za účelem 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 output
Všechny chyby, které vznikají při zpracování, se zobrazí v okně chyb sady Visual Studio.Kromě toho můžete být na chyby upozorněni určením zpětného volání, které implementuje ITextTemplatingCallback.
Pokud chcete výsledný řetězec zapsat do souboru, zřejmě budete chtít vědět, jaká přípona souboru a kódování jsou zadané v direktivě <#@output#> v šabloně.Tyto informace budou do zpětného volání rovněž předány.Další informace naleznete v tématu T4 – direktiva 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; }
}
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.
V okně chyb sady Visual Studio se zobrazí upozornění kompilátoru a také se vygeneruje volání ErrorCallback.
Parametry odkazu
Hodnoty můžete předávat mimo textovou šablonu pomocí třídy parametru, která je odvozena od MarshalByRefObject.
Související témata
Vygenerování textu z předzpracované textové šablony:
Volejte metodu TransformText() generované třídy.Další informace naleznete v tématu Generování textu za běhu pomocí textových šablon T4.Vygenerová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.Vygenerování zdrojového kódu, který lze později zkompilovat a spustit:
Volejte metodu t4.PreprocessTemplate() v ITextTemplating.