c# - 在 Visual Studio 中运行命令的 DTE2 问题

标签 c# windows visual-studio visual-studio-extensions service-provider

在 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/

相关文章:

c# - 发送从 Spy++ 获取的消息

c++ - 有人试过在 Windows 上编译 Go 吗?它现在似乎支持生成 PE 格式的二进制文件

windows - Powershell DSC Pull Server 抛出内部错误 - Microsoft.Isam.Esent.Interop not found

c# - 如何在 Visual Studio 中读取内存快照

c++ - 如何在C++中读取二进制图像(tif)?

c# - LoadLibrary() 在 C# 中返回 0

c# - 通过 C# 代码发出 http 请求?

c# - 从变量实例化泛型类型

c# - 在 C# 中处理大文件时出现内存不足异常

c# - 创建可以通过在背景区域中的任意位置拖动来移动的非矩形表单