Visual Studio 2015 - список ошибок чтения EnvDTE

Я собираюсь создать небольшой инструмент сборки. Единственное, что он должен сделать: попытаться построить решение и вывести ошибки. Но не у меня есть следующая проблема: В случае сбоя сборки я не могу прочитать список ошибок. Программа застревает и ждет до бесконечности.

Я создал небольшой тестовый класс, который ничего не делает, кроме создания экземпляра Visual Studio 2015, сборки данного решения и считывания ErrorList при сбое сборки.

class Class1
{
    DTE2 dte = (DTE2)System.Activator.CreateInstance(System.Type.GetTypeFromProgID("VisualStudio.DTE.14.0", true));

    public void Test()
    {
        int id = dte.LocaleID;
        //dte.MainWindow.Visible = true;

        dte.Events.BuildEvents.OnBuildDone += new _dispBuildEvents_OnBuildDoneEventHandler(BuildEvents_OnBuildDone);

        string solutionFile = @"C:\MyProjects\SolutionWithBuildErrors.sln";

        dte.Solution.Open(solutionFile);

        while (!dte.Solution.IsOpen)
            System.Threading.Thread.Sleep(100);

        Console.WriteLine("Start Build");
        dte.Solution.SolutionBuild.Build(true);
        Console.WriteLine("Finished Build");

        dte.Quit();
    }

    private void BuildEvents_OnBuildDone(vsBuildScope Scope, vsBuildAction Action)
    {
        Console.WriteLine("BuildEvents_OnBuildDone Called");

        int buildInfo = dte.Solution.SolutionBuild.LastBuildInfo;
        switch (buildInfo)
        {
            case 0:
                Console.WriteLine("Build erfolgreich");
                break;
            case 1:
                Console.WriteLine("Build fehlerhaft");

                getErrorList();
                break;
        }
    }

    private void getErrorList()
    {
        //dte.ExecuteCommand("View.ErrorList", " ");

        Console.WriteLine("Lade Tool Windows");
        ToolWindows tw = dte.ToolWindows;
        Console.WriteLine("Geladen, Tool Windows");

        Console.WriteLine("Lade ErrorList");
        ErrorList el = tw.ErrorList;
        Console.WriteLine("Geladen, ErrorList");

        el.ShowErrors = true;

        Console.WriteLine("Lese Error Liste");

        //dte.ExecuteCommand("View.ErrorList", " ");
        //ErrorItems errors = dte.ToolWindows.ErrorList.ErrorItems;
        Console.WriteLine("#Errors: " + dte.ToolWindows.ErrorList.ErrorItems.Count);
        for (int i = 1; i <= dte.ToolWindows.ErrorList.ErrorItems.Count; i++)
        {
            ErrorItem ei = dte.ToolWindows.ErrorList.ErrorItems.Item(i);
            string errorLevel = "N/A";
            errorLevel = ei.ErrorLevel.ToString();

            string desc = "N/A";
            if (ei.Description != null)
                desc = ei.Description.ToString();

            string file = "N/A";
            if (ei.FileName != null)
                file = ei.FileName.ToString();

            string line = "N/A";
            line = ei.Line.ToString();

            string error = string.Format("{0}: {1}, File: {2}, Line: {3}", errorLevel, desc, file, line);

            Console.WriteLine(error);
        }
    }
}

Для тестирования просто создайте консольное приложение. В основном:

Class1 c1 = new Class1();
c1.Test();

Console.ReadLine();

Необходимые импорты: EnvDTE EnvDTE80

Я уже пытался запустить Visual Studio в Visible-Mode, и в случае, когда экземпляр Visual Studio получает фокус, находясь в режиме "ожидания чтения ErrorList", можно прочитать ErrorList. Если Visual Studio никогда не получает фокус (потому что работает невидимым или никогда не щелкает в то время как работает видимым), невозможно получить ErrorList.

Может быть, есть другой способ зачитать ErrorList? Только что нашел решение, которое я использую =(

Может быть, вы можете помочь мне или убедиться, что действительно есть проблемы с ErrorList.

2 ответа

Это еще один способ получить список ошибок - если это действительно ваша проблема:

        EnvDTE.Window window = this.dte.Windows.Item(EnvDTE80.WindowKinds.vsWindowKindErrorList);
        EnvDTE80.ErrorList sel = (EnvDTE80.ErrorList)window.Selection;

Но оба способа должны быть достаточно эквивалентными. Microsoft переписала реализацию окна списка ошибок для VS 2015, что привело к возникновению некоторых проблем в процессе, поэтому я бы посоветовал попробовать ваш код с более ранними версиями.

Была ли эта проблема решена или нет, я не знаю, но если она существует, перейдите к концепции ActiveX, чтобы решить эту проблему (более или менее вы можете перейти к пользовательскому управлению). Конечно, эта проблема решится. Я сделал то же самое для своих требований. Не нужно фокусироваться на соответствующей Visual Studio.

Другие вопросы по тегам