Я пытаюсь создать расширение Visual Studio (с командой), которое может обрабатывать текстовые шаблоны (T4).
Я пытался перейти на эту страницу, в заголовке которой написано «Передача значений параметров в шаблон». Я пытаюсь скопировать код под этим заголовком в файл «Command» и получаю сообщение об ошибке, связанное с переменной dte. Может ли кто-нибудь помочь мне с этим, поскольку я совершенно новичок в расширениях Visual Studio? Я не уверен, как «получить поставщика услуг» или что такое «DTE», и я думаю, что все усложняет тот факт, что это асинхронный метод.
Вот код, который у меня есть в командном файле расширения:
using EnvDTE;
using EnvDTE80;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.TextTemplating;
using Microsoft.VisualStudio.TextTemplating.VSHost;
using System.IO;
namespace TestVSIXExtension
{
[Command(PackageIds.MyCommand)]
internal sealed class MyCommand : BaseCommand<MyCommand>
{
protected override async Task ExecuteAsync(OleMenuCmdEventArgs e)
{
// Get a service provider - how you do this depends on the context:
IServiceProvider serviceProvider = dte; // or dslDiagram.Store, for example
// Get the text template service:
ITextTemplating t4 = serviceProvider.GetService(typeof(STextTemplating)) as ITextTemplating;
ITextTemplatingSessionHost host = t4 as ITextTemplatingSessionHost;
// Create a Session in which to pass parameters:
host.Session = host.CreateSession();
// Add parameter values to the Session:
session["TimesToRepeat"] = 5;
// Process a text template:
string result = t4.ProcessTemplate("MyTemplateFile.t4",
System.IO.File.ReadAllText("MyTemplateFile.t4"));
await VS.MessageBox.ShowWarningAsync("TestVSIXExtension", "Button clicked");
}
}
}
Потребовались часы, чтобы найти решение, но вот оно. Жаль, что нет обновленного руководства о том, как это сделать.
using EnvDTE;
using EnvDTE80;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.TextTemplating;
using Microsoft.VisualStudio.TextTemplating.VSHost;
using System.IO;
namespace TestVSIXExtension
{
[Command(PackageIds.MyCommand)]
internal sealed class MyCommand : BaseCommand<MyCommand>
{
protected override async Task ExecuteAsync(OleMenuCmdEventArgs e)
{
// Get the text template service:
ITextTemplating t4 = await Package.GetServiceAsync(typeof(STextTemplating)) as ITextTemplating;
ITextTemplatingSessionHost host = t4 as ITextTemplatingSessionHost;
// Create a Session in which to pass parameters:
host.Session = host.CreateSession();
// Add parameter values to the Session:
session["TimesToRepeat"] = 5;
// Process a text template:
string result = t4.ProcessTemplate("MyTemplateFile.t4",
System.IO.File.ReadAllText("MyTemplateFile.t4"));
await VS.MessageBox.ShowWarningAsync("TestVSIXExtension", "Button clicked");
}
}
}
Чтобы начать правильно, загляните сюда: vsixcookbook.com