Список задач VSIX ErrorListProvider пуст - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь создать расширение Visual Studio с помощью SDK, создавая пакет VSIX. Я использую предварительную версию Microsoft Visual Studio 2019; Версия 16.7.0 Предварительная версия 1.0

private readonly AsyncPackage package;

private void Test1()
{
    ThreadHelper.ThrowIfNotOnUIThread();

    var ivsSolution = (IVsSolution)Package.GetGlobalService(typeof(IVsSolution));
    var dte = (EnvDTE80.DTE2)Package.GetGlobalService(typeof(EnvDTE.DTE));
    var errorListProvider = new ErrorListProvider(package);
    var tasks = errorListProvider.Tasks.Count;
}

Последняя строка оценивается как ноль, даже если в окне ошибок отображается много ошибок. Что я делаю не так?

Спасибо,

1 Ответ

1 голос
/ 27 мая 2020

ErrorListProvider предоставляет ошибки в окне инструментов списка ошибок. Чтобы отобразить (или получить доступ) существующие ошибки, вы можете использовать инструмент Windows .ErrorList, как предложил Клаус. Пример кода в документации не совсем правильный. Похоже, это было взято из проекта пользовательской надстройки, который теперь устарел. В этих старых проектах надстройки applicationObject часто ссылался на интерфейс DTE.

Из пакета VSSDK вы должны сделать что-то вроде следующего:

using System;
using System.ComponentModel.Design;
using System.Runtime.InteropServices;
using System.Threading;
using Microsoft;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using Task = System.Threading.Tasks.Task;
using EnvDTE80;

namespace GetErrorsDemo
{

    [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
    [Guid(GetErrorsDemoPackage.PackageGuidString)]
    [ProvideMenuResource("Menus.ctmenu", 1)]
    public sealed class GetErrorsDemoPackage : AsyncPackage
    {
        public const string PackageGuidString = "90adc626-67bd-42d5-babc-6e4c5aa6e351";
        public static readonly Guid CommandSet = new Guid("5a7f888e-8767-4a4a-a06b-1b06c4f1e3f4");
        public const int ErrorsListCommand = 0x0100;

        protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
        {
            await this.JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);

            // add our menu handler
            OleMenuCommandService commandService = await this.GetServiceAsync(typeof(IMenuCommandService)) as OleMenuCommandService;
            Assumes.Present(commandService);
            var menuCommandID = new CommandID(CommandSet, ErrorsListCommand);
            var menuItem = new MenuCommand(this.OnErrorsListCommand, menuCommandID);
            commandService.AddCommand(menuItem);
        }

        private void OnErrorsListCommand(object sender, EventArgs e)
        {
            ThreadHelper.ThrowIfNotOnUIThread();

            DTE2 dte = (DTE2)GetService(typeof(SDTE));
            Assumes.Present(dte);
            ErrorList errorList = dte.ToolWindows.ErrorList;
            for (int i = 1; i <= errorList.ErrorItems.Count; i++)
            {
                string msg = string.Format("Description: {0}", errorList.ErrorItems.Item(i).Description);
                VsShellUtilities.ShowMessageBox(this, msg, "GetErrors Demo", OLEMSGICON.OLEMSGICON_INFO, OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);
            }
        }
    }
}
...