Visual Studio 中 运行 命令的 DTE2 问题
Problem with DTE2 for Running Commands in Visual Studio
在 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));
这是一个异步函数,试试这个:
private async void Execute(object sender, EventArgs e)
{
var dte = await package.GetServiceAsync(typeof(DTE));
DTE2 dte2 = dte2 as DTE2;
if(dte2 != null){
ExecuteCommand(dte2, string.Format("View.ClassView"));
}
}
或者,使用 ConfigureAwait:
private async void Execute(object sender, EventArgs e)
{
DTE2 dte2 = await package.GetServiceAsync(typeof(DTE)).ConfigureAwait(false) as DTE2;
if(dte2 != null){
ExecuteCommand(dte2, string.Format("View.ClassView"));
}
}
您正在谈论的视频: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;
在 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));
这是一个异步函数,试试这个:
private async void Execute(object sender, EventArgs e)
{
var dte = await package.GetServiceAsync(typeof(DTE));
DTE2 dte2 = dte2 as DTE2;
if(dte2 != null){
ExecuteCommand(dte2, string.Format("View.ClassView"));
}
}
或者,使用 ConfigureAwait:
private async void Execute(object sender, EventArgs e)
{
DTE2 dte2 = await package.GetServiceAsync(typeof(DTE)).ConfigureAwait(false) as DTE2;
if(dte2 != null){
ExecuteCommand(dte2, string.Format("View.ClassView"));
}
}
您正在谈论的视频: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;