2016-06-13 29 views
0

Ich schreibe ein Out-of-Process-Konsolenprogramm, das Visual Studio (2012) automatisiert. Ich muss den Inhalt des Ausgabebereiches entweder sofort lesen oder vorzugsweise zu einer Benachrichtigung für jede Zeile im Ausgabefenster hinzufügen.So erhalten Sie den Visual Studio-Ausgabefensterinhalt über EnvDTE (Non-Package)

Ich habe einige Beispiele gesehen, die nur beim Schreiben eines Pakets zutreffen, aber sie werden nicht angewendet, wenn Sie dies für ein veraltetes Programm tun.

Das große Problem im Moment ist, dass ich den Ausgabefenster-Service nicht über GetService eines Service Providers bekommen kann. es gibt immer null zurück. Ich bin mir nicht sicher, ob ich es bekommen kann, wenn ich kein Paket schreibe.

+0

Sind Sie einen Verweis auf eine aktuell ausgeführte Instanz zu arbeiten bekommen? Dies kann sehr schwierig sein. http://StackOverflow.com/Questions/14205933/How-Do--Get-the-Dte-for-Running-visual-Studio-Instance/14205934#14205934 – Will

+0

Ich bin eigentlich derjenige, der es erstellt mit: Var vsType = Type.GetTypeFromProgID ("VisualStudio.DTE.11.0"); _dte = Activator.CreateInstance (vsType) als DTE2; – Tal

Antwort

0

Dies scheint für mich

public string GetOutput() 
{ 
    const string buildOutputPaneGuid = "{1BD8A850-02D1-11D1-BEE7-00A0C913D1F8}"; 
    const string vsWindowKindOutput = "{34E76E81-EE4A-11D0-AE2E-00A0C90FFFC3}"; 
    var outputWindow = dte.Windows.Item(/*EnvDTE.Constants.*/vsWindowKindOutput); 
    var outputWindowDynamic = outputWindow.Object; 

    foreach(OutputWindowPane pane in outputWindowDynamic.OutputWindowPanes) 
    { 
     if (pane.Guid == buildOutputPaneGuid) 
     { 
      try 
      { 
       pane.Activate(); 
       var sel = pane.TextDocument.Selection; 
       sel.StartOfDocument(false); 
       sel.EndOfDocument(true); 
       return sel.Text; 
      } 
      catch (Exception ex) 
      { 
       return null; 
      } 
     } 
    } 

    return null; 
}