Richiamo della trasformazione del testo in un'estensione VS
Se si scrive un'estensione di Visual Studio, quale un comando di menu o un linguaggio specifico di dominio, è possibile utilizzare il servizio del modello di testo per trasformare i modelli di testo. Ottenere il servizio STextTemplating ed eseguirne il cast su ITextTemplating.
Come ottenere il servizio del modello di testo
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));
Passaggio dei parametri al modello
È possibile passare i parametri nel modello. Nel modello è possibile ottenere i valori dei parametri tramite la direttiva <#@parameter#>.
Per il tipo di un parametro, è necessario utilizzare un tipo serializzabile o di cui può essere eseguito il marshalling. In altri termini, è necessario dichiarare il tipo con SerializableAttribute oppure deve essere derivata da MarshalByRefObject. Questa restrizione è necessaria perché il modello di testo viene eseguito in un AppDomain separato. Tutti i tipi incorporati, quali System.String e System.Int32 sono serializzabili.
Per passare i valori dei parametri, il codice chiamante può inserire i valori nel dizionario Session o in CallContext.
Nell'esempio seguente per trasformare un modello di testo breve vengono utilizzati entrambi i metodi:
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
Segnalazione errori e direttiva Output
Qualsiasi errore che si verifica durante l'elaborazione verrà visualizzato nella finestra di errore di Visual Studio. È inoltre possibile ricevere una notifica degli errori specificando un callback che implementa ITextTemplatingCallback.
Se si desidera scrivere la stringa di risultato in un file, è utile conoscere quale estensione di file e codifica sono state specificate nella direttiva <#@output#> del modello. Anche queste informazioni verranno passate al callback. Per altre informazioni, vedere Direttiva output T4.
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; }
}
Il codice può essere testato con un file modello simile a quello seguente:
<#@output extension=".htm" encoding="ASCII"#>
<# int unused; // Compiler warning "unused variable"
#>
Sample text.
L'avviso del compilatore verrà visualizzato nella finestra di errore di Visual Studio e genererà inoltre una chiamata a ErrorCallback.
Parametri di riferimento
È possibile passare i valori da un modello di testo tramite una classe di parametri derivata da MarshalByRefObject.
Argomenti correlati
Per generare testo da un modello di testo pre-elaborato:
Chiamare il metodo TransformText() della classe generata. Per altre informazioni, vedere Generazione di testo in fase di esecuzione con modelli di testo T4.Per generare testo all'esterno di un'estensione di Visual Studio:
Definire un host personalizzato. Per altre informazioni, vedere Elaborazione di modelli di testo tramite un host personalizzato.Per generare codice sorgente che può essere compilato ed eseguito in un secondo momento:
Chiamare il metodo t4.PreprocessTemplate() di ITextTemplating.