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 = dte;
// 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 ulteriori 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 riportato di seguito:
<#@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 ulteriori informazioni, vedere Generazione di testo in fase di esecuzione tramite modelli di testo T4 pre-elaborati.Per generare testo all'esterno di un'estensione di Visual Studio:
Definire un host personalizzato. Per ulteriori 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 ITextTemplatingInterface.
Cronologia delle modifiche
Data |
Cronologia |
Motivo |
---|---|---|
Marzo 2011 |
Creato argomento |
Miglioramento delle informazioni. |