在 YouTube 上观看了如何入门的视频后,我正在尝试为 Visual Studio 进行扩展。在遵循一些说明后,我在尝试在工具下的菜单中设置自定义命令的扩展时遇到了一个较小的错误。
DTE2 dte = (DTE2)ServiceProvider.GetServiceAsync(typeof(DTE));
我的 ServiceProvider 是 IAsyncServiceProvider
而不是 ServiceProvider
。那么有没有一种方法可以创建 DTE2 对象,而无需将所有内容从 IAsyncServiceProvider
更改为 ServiceProvider
。
我的代码:
<code> public static async Task InitializeAsync(AsyncPackage package)
{
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(package.DisposalToken);
OleMenuCommandService commandService = await package.GetServiceAsync((typeof(IMenuCommandService))) as OleMenuCommandService;
Instance = new FRC(package, commandService);
}
public static void ExecuteCommand(DTE2 dte, string commandName)
{
ThreadHelper.ThrowIfNotOnUIThread();
var command = dte.Commands.Item(commandName);
if (command.IsAvailable)
{
dte.ExecuteCommand(command.Name);
}
}
private void Execute(object sender, EventArgs e)
{
DTE2 dte = package.GetServiceAsync(typeof(DTE2)) as DTE2;
ThreadHelper.ThrowIfNotOnUIThread();
ExecuteCommand(dte, string.Format("View.ClassView"));
}
}
</code>
他的代码:
var dte = (DTE2)ServiceProvider.GetService(typeof(DTE));
最佳答案
您正在谈论的视频:https://www.youtube.com/watch?v=MFiRotBsVKU
我使用了 Andre.L 解决方案及其工作原理。
代码和函数中有两行需要更改
private void Execute(object sender, EventArgs e)
首先将关键字async
添加到函数签名中
private async void Execute(object sender, EventArgs e)
然后更改此行
DTE2 dte = package.GetServiceAsync(typeof(DTE2)) as DTE2;
进入此
var dte = await package.GetServiceAsync(typeof(DTE)).ConfigureAwait(false) as DTE2;
关于c# - 在 Visual Studio 中运行命令的 DTE2 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52489541/