Проблема с DTE2 для запуска команд в Visual Studio - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь сделать расширение для visual studio после просмотра видео на Youtube о том, как начать.Следуя некоторым инструкциям, я наткнулся на небольшую ошибку при попытке установить расширение для настраиваемой команды в Меню под инструментами.

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

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Видео, о котором вы говорите: 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;
0 голосов
/ 26 ноября 2018

Это асинхронная функция, попробуйте это вместо:

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"));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...