Invocar a transformação de texto em uma extensão do VS
Se você estiver escrevendo um Visual Studio a extensão como um comando de menu ou uma linguagem específica de domínio, você pode usar o serviço de modelagem de texto para transformar modelos de texto. Obter o STextTemplating de serviço e lançá-lo para ITextTemplating.
Obtendo o serviço de modelagem de texto
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));
Passando parâmetros para o modelo.
Você pode passar parâmetros para o modelo. Dentro do modelo, você pode obter os valores de parâmetro usando a <#@parameter#> diretiva.
Para o tipo de um parâmetro, você deve usar um tipo serializável ou que pode ser empacotado. Ou seja, o tipo deve ser declarado com SerializableAttribute, ou deve ser derivado de MarshalByRefObject. Essa restrição é necessária porque o modelo de texto é executado em um AppDomain separado. Todos os tipos internos, como System.String e System.Int32 são serializáveis.
Para passar valores de parâmetro, o código de chamada pode colocar valores ou do Session dicionário, ou do CallContext.
O exemplo a seguir usa os dois métodos para transformar um modelo de teste rápido:
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
Relatório de erros e a diretiva de saída
Quaisquer erros que possam surgir durante o processamento serão exibidos na Visual Studio janela de erro. Além disso, você pode ser notificado de erros, especificando um retorno de chamada implementa ITextTemplatingCallback.
Se você quiser gravar a seqüência de caracteres do resultado em um arquivo, talvez você queira saber qual extensão de arquivo e codificação especificada na <#@output#> a diretiva no modelo. Essas informações também serão passadas para o seu retorno de chamada. Para obter mais informações, consulte T4 Diretiva de saída.
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; }
}
O código pode ser testado com um arquivo de modelo semelhante ao seguinte:
<#@output extension=".htm" encoding="ASCII"#>
<# int unused; // Compiler warning "unused variable"
#>
Sample text.
O aviso do compilador serão exibidos na Visual Studio janela de erro e ele também irá gerar uma chamada para ErrorCallback.
Parâmetros de referência
Você pode passar valores de um modelo de texto usando uma classe de parâmetro que é derivada de MarshalByRefObject.
Tópicos relacionados
Para gerar o texto de um modelo de texto pré-processado:
Chamar o TransformText() o método da classe de gerado. Para obter mais informações, consulte Geração de texto de tempo de execução usando os modelos de texto T4.Para gerar o texto fora um Visual Studio extensão:
Defina um host personalizado. Para obter mais informações, consulte Modelos de texto de processamento por meio de um Host personalizado.Para gerar o código-fonte que posteriormente pode ser compilado e executado:
Chamar o t4.PreprocessTemplate() o método de ITextTemplatingInterface.
Histórico de alterações
Date |
History |
Motivo |
---|---|---|
Março de 2011 |
Tópico criado |
Aprimoramento de informações. |