2016-04-25 142 views
1

我即将创建一个小型构建工具。它应该做的唯一事情:尝试构建解决方案并输出错误。 但不是我有以下问题:如果生成失败,我无法读取ErrorList。程序卡住了,一直等到永远。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中的Visual Studio实例获得焦点,而在“等待ErrorList Read“可以读取ErrorList。 如果Visual Studio永远不会获得焦点(因为运行不可见或从不点击进入运行时可见),它不可能接收ErrorList。

也许有另一种方式来读出ErrorList? 刚刚发现我使用=(

也许你能帮助我,或验证有真与ErrorList烦恼的解决方案

回答

0

这是另一种方式来获得在ErrorList - 如果这真的是你的问题:。

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

但这两种方式应该是相当相当于微软没有为VS 2015年重新编写错误列表窗口的实现 - 引入一些问题的过程中,所以我建议试图对早期版本的代码