Вызов преобразования текста в расширении VS
При создании расширения Visual Studio, такого как команда меню или доменный язык, для преобразования текстовых шаблонов можно воспользоваться службой текстовых шаблонов. Получите службу типа STextTemplating и выполните приведение к типу ITextTemplating.
Получение службы текстовых шаблонов
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));
Передача параметров в шаблоны
Параметры можно передавать в шаблон. Чтобы получить значения параметров в шаблоне, можно воспользоваться директивой <#@parameter#>.
Для этого типа параметра необходимо использовать сериализуемый или маршалируемый тип. Это значит, что тип должен объявляться с типом SerializableAttribute или наследоваться от типа MarshalByRefObject. Это ограничение является обязательным, потому что текстовый шаблон выполняется в отдельном домене приложения. Все встроенные типы, такие как System.String и System.Int32, являются сериализуемыми.
Для передачи значений параметров вызывающий код может размещать значения либо в словаре Session, либо в типе CallContext.
В следующем примере оба метода использованы для преобразования короткого тестового шаблона:
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
Отчеты об ошибках и директива Output
Любые ошибки, возникающие в процессе обработки, отображаются в окне ошибок Visual Studio. Кроме того, чтобы настроить уведомления об ошибках, можно задать обратный вызов, реализующий ITextTemplatingCallback.
Если необходимо записать строку результатов в файл, полезно знать, какие расширение файла и кодировка были заданы в директиве <#@output#> шаблона. Эти сведения также передаются обратному вызову. Дополнительные сведения см. в разделе Директива 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; }
}
Код можно протестировать с использованием файла шаблона, аналогичного следующему:
<#@output extension=".htm" encoding="ASCII"#>
<# int unused; // Compiler warning "unused variable"
#>
Sample text.
Предупреждение компилятора отображается в окне ошибок Visual Studio и создает вызов ErrorCallback.
Параметры ссылок
Можно передавать значения из текстового шаблона, используя класс параметров, наследуемый от MarshalByRefObject.
Связанные разделы
Создание текста из предварительно обработанного текстового шаблона
Вызовите метод TransformText() сгенерированного класса. Дополнительные сведения см. в разделе Создание текста во время выполнения с помощью предварительно обработанных текстовых шаблонов T4.Создание текста за пределами расширения Visual Studio
Определите пользовательское основное приложение. Дополнительные сведения см. в разделе Обработка текстовых шаблонов с помощью пользовательского хост-класса.Создание исходного кода с возможностью последующей компиляции и выполнения
Вызовите метод t4.PreprocessTemplate() типа ITextTemplatingInterface.
Журнал изменений
Дата |
Журнал |
Причина |
---|---|---|
Март 2011 |
Создан раздел |
Улучшение информации. |