2016-06-13 1 views
0

J'écris un programme de console hors processus qui automatise Visual Studio (2012). J'ai besoin d'obtenir le contenu du volet de sortie soit le lire en une fois ou de préférence enregistrer à une notification sur chaque ligne ajoutée à la fenêtre de sortie.Comment obtenir le contenu de la fenêtre de sortie Visual Studio via EnvDTE (Non-Package)

J'ai vu quelques exemples qui ne s'appliquent que lors de l'écriture d'un paquet, mais ils ne s'appliqueront pas dans le cas d'un programme hors processus. Le gros problème à l'heure actuelle est que je ne peux pas obtenir le service de fenêtre de sortie via GetService d'un fournisseur de services. il retourne toujours nul. Je ne suis pas sûr que je peux l'obtenir si je n'écris pas un paquet.

+0

Êtes-vous obtenir une référence à une instance en cours d'exécution? Cela peut être très difficile. http://stackoverflow.com/questions/14205933/how-do-i-get-the-dte-for-running-studio-studio-instance/14205934#14205934 – Will

+0

Je suis en fait celui qui le crée en utilisant: var vsType = Type.GetTypeFromProgID ("VisualStudio.DTE.11.0"); _dte = Activator.CreateInstance (vsType) comme DTE2; – Tal

Répondre

0

Cela semble fonctionner pour moi

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