2016-04-25 14 views
1

Ich bin dabei, ein kleines Build-Tool zu erstellen. Die einzigen Dinge, die es tun sollte: Versuchen Sie, die Lösung zu erstellen und die Fehler auszugeben. Aber ich habe nicht das folgende Problem: Wenn der Build fehlschlägt, kann ich die ErrorList nicht lesen. Das Programm bleibt hängen und wartet für immer.Visual Studio 2015 - EnvDTE Read ErrorList

Ich habe eine kleine Testklasse erstellt, die nichts anderes tut, als eine Instanz von Visual Studio 2015 zu erstellen, die gegebene Lösung zu erstellen und die ErrorList auf Build fail auszulesen.

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); 
     } 
    } 
} 

Zu Testzwecken einfach eine Konsolenanwendung erstellen. Im Haupt:

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

Console.ReadLine(); 

Notwendige Importe: EnvDTE EnvDTE80

Ich habe bereits versucht, die Visual Studio in Visible-Modus und im Falle der Visual Studio-Instanz erhält den Fokus, während in der "laufen warte auf ErrorList Read "die ErrorList kann gelesen werden. Wenn das Visual Studio nie den Fokus erhält (weil unsichtbar ausgeführt wird oder nie während der Ausführung sichtbar klickt), ist es nicht möglich, die ErrorList zu erhalten.

Vielleicht gibt es eine andere Möglichkeit, die ErrorList auszulesen? fand einfach die Lösung Ich verwende = (

Vielleicht können Sie mir oder zu überprüfen, helfen, dass es wirklich Probleme mit dem Errorlist

Antwort

0

Dies ist ein weiterer Weg, um an der Errorlist zu bekommen -. Wenn das wirklich Ihre Problem:..

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

Aber beide Richtungen sollte ziemlich gleichwertig sein Microsoft hat Fenster Fehlerliste Implementierung neu zu schreiben für VS 2015 - einige Probleme in den Prozess einzuführen, so würde ich vorschlagen, Ihren Code gegen frühere Versionen versuchen