簡體   English   中英

Visual Studio 2015 - EnvDTE讀取ErrorList

[英]Visual Studio 2015 - EnvDTE Read ErrorList

我即將創建一個小型構建工具。 它應該做的唯一事情:嘗試構建解決方案並輸出錯誤。 但不是我有以下問題:如果Build失敗,我無法讀取ErrorList。 程序卡住了,等到永遠。

我創建了一個小型測試類,除了創建Visual Studio 2015的實例之外什么也沒做,構建給定的解決方案並在Build失敗時讀出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? 剛剛找到我正在使用的解決方案=(

也許你可以幫我解決或驗證ErrorList確實存在問題。

這是獲取ErrorList的另一種方法 - 如果這確實是你的問題:

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

但兩種方式都應該相當。 微軟確實為VS 2015重新編寫了錯誤列表窗口實現 - 在此過程中引入了一些問題,因此我建議您針對早期版本嘗試使用代碼。

是否已解決此問題我不知道,但如果它存在則繼續使用ActiveX概念解決此問題(或多或少可以繼續用戶控制)。 當然這個問題將解決我已經為我的要求做了同樣的事情。不需要將焦點放在相應的Visual Studio上

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM