【问题标题】:Visual Studio 2015 - EnvDTE Read ErrorListVisual Studio 2015 - EnvDTE 读取错误列表
【发布时间】:2016-04-25 07:08:36
【问题描述】:

我即将创建一个小型构建工具。它应该做的唯一事情是:尝试构建解决方案并输出错误。 但不是我有以下问题:如果构建失败,我无法读取错误列表。程序卡住了,一直等到永远。

我创建了一个小型测试类,它除了创建 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,如果 Visual Studio 实例在“等待读取 ErrorList”时获得焦点,则可以读取 ErrorList。 如果 Visual Studio 从未获得焦点(因为运行不可见或在运行可见时从不点击),则无法接收 ErrorList。

也许还有另一种读出错误列表的方法? 刚刚找到我正在使用的解决方案 =(

也许你可以帮助我或者验证一下 ErrorList 确实有问题。

【问题讨论】:

    标签: c# visual-studio-2015 envdte error-list


    【解决方案1】:

    这是获取 ErrorList 的另一种方法 - 如果这确实是您的问题:

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

    但是这两种方式应该是相当的。 Microsoft 确实为 VS 2015 重新编写了错误列表窗口实现 - 在此过程中引入了一些问题,因此我建议您针对早期版本尝试您的代码。

    【讨论】:

      【解决方案2】:

      这个问题是否已经解决我不知道,但如果它存在然后继续使用 ActiveX 概念来解决这个问题(或多或少你可以继续使用用户控制)。当然这个问题会解决我已经为我的要求做了同样的事情。无需专注于各自的 Visual Studio

      【讨论】:

        猜你喜欢
        • 2018-04-27
        • 2016-03-09
        • 1970-01-01
        • 2015-07-15
        • 2018-03-15
        • 1970-01-01
        • 2016-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多