Вызов преобразования текста в расширении Visual Studio
Если вы пишете расширение 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 = ...; // 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));
Передача параметров в шаблон
Параметры можно передавать в шаблон. Чтобы получить значения параметров в шаблоне, можно воспользоваться директивой <#@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
Отчеты об ошибках и директива вывода
Все ошибки, возникающие во время обработки, будут отображаться в окне ошибки Visual Studio. Кроме того, можно получить уведомление об ошибках, указав обратный вызов, реализующий ITextTemplatingCallback.
Если необходимо записать строку результатов в файл, полезно знать, какие расширение файла и кодировка были заданы в директиве <#@output#>
шаблона. Эти сведения также передаются обратному вызову. Дополнительные сведения см. в директиве T4 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; }
}
Код можно протестировать с использованием файла шаблона, аналогичного следующему:
<#@output extension=".htm" encoding="ASCII"#>
<# int unused; // Compiler warning "unused variable"
#>
Sample text.
Предупреждение компилятора появится в окне ошибки Visual Studio, и он также создаст вызов ErrorCallback
.
Параметры ссылок
Можно передавать значения из текстового шаблона, используя класс параметров, наследуемый от MarshalByRefObject.
Связанные статьи
Чтобы создать текст из предварительно обработанного текстового шаблона: вызовите TransformText()
метод созданного класса. Дополнительные сведения см. в статье Создание текста во время выполнения с помощью текстовых шаблонов T4.
Чтобы создать текст за пределами расширения Visual Studio, определите пользовательский узел. Дополнительные сведения см. в разделе "Обработка текстовых шаблонов" с помощью пользовательского узла.
Чтобы создать исходный код, который можно скомпилировать и выполнить: вызовите метод PreprocessTemplate iTextTemplating.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по