【问题标题】:Problem with DTE2 for Running Commands in Visual Studio在 Visual Studio 中运行命令的 DTE2 问题
【发布时间】:2019-02-28 13:37:47
【问题描述】:

在观看 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));

【问题讨论】:

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


    【解决方案1】:

    这是一个异步函数,试试这个:

    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"));
        }
    }
    

    【讨论】:

      【解决方案2】:

      你说的视频: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;
      

      【讨论】:

        猜你喜欢
        • 2018-11-29
        • 2016-06-04
        • 2018-11-02
        • 1970-01-01
        • 1970-01-01
        • 2021-05-11
        • 2020-01-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多