2011-10-14 14 views
11

Sto scrivendo un semplice add-in di Visual Studio 2010 per fare un lavoro di copia comune qui al lavoro (ottenendo dll da libs sln).Come scrivere nella finestra di output in AddIn di Visual Studio 2010?

Voglio che l'avanzamento della copia venga scritto nella finestra di output.

Ho provato Trace.WriteLine(...) aspettandomi di farlo, ma non quando eseguo il componente aggiuntivo nel debugger. Non l'ho ancora provato in nessun altro modo.

Ho trovato alcuni esempi di farlo in Visual Studio 2008, ma le librerie richieste non sono disponibili per fare riferimento.

Qualcuno può indicarmi come scrivere nella finestra di output? Le mie capacità di google mi hanno deluso.

risposta

16

Ho fatto questo per una macro che ho scritto:

Window window = dte.Windows.Item(EnvDTE.Constants.vsWindowKindOutput); 
OutputWindow outputWindow = (OutputWindow) window.Object; 
outputWindow.ActivePane.Activate(); 
outputWindow.ActivePane.OutputString(message); 

Ecco un link per il DTE Interfaccia: http://msdn.microsoft.com/en-us/library/envdte.dte(v=VS.100).aspx

+0

Qual è l'oggetto dte? (leggi i documenti ora, ma sarebbe bello nella risposta per riferimento futuro) –

+1

Per chi segue, dte, è definito nel connect.cs, sul metodo connect. Cerca questo verso il fondo del file: DTE2 _applicationObject privato; Usalo come dte –

+0

Questo ha funzionato per me :) – Achilles

1

Sto scrivendo un Visual Studio Add-in e aveva lo stesso problema, tuttavia quando provando la risposta sopra ho trovato che la linea:

outputWindow.ActivePane.Activate(); 

ha dato un errore.

NullReferenceException - Riferimento oggetto non impostato su un'istanza di un oggetto.

Tuttavia ora ho trovato un modo leggermente diverso per risolvere il problema:

Window window = applicationObject.Windows.Item(Constants.vsWindowKindOutput); 
OutputWindow outputWindow = (OutputWindow)window.Object; 
OutputWindowPane owp; 
owp = outputWindow.OutputWindowPanes.Add("new pane"); 
owp.OutputString("hello"); 
8

Come Robert ha sottolineato, il codice di John sarà un'eccezione quando non c'è ActivePane. Se c'è un pannello attivo, userà qualsiasi pannello sia attivo.

Un problema che ho con l'esempio di Robert dipende da dove si crea il riquadro, che nel mio caso è il metodo Exec, creerà più riquadri con lo stesso nome ogni volta che viene eseguito.

Includendo il mio esempio su come ho risolto il problema. Abbastanza semplice, controlla prima l'esistenza della finestra ...

 Window   window   = _applicationObject.Windows.Item(EnvDTE.Constants.vsWindowKindOutput); 
     OutputWindow  outputWindow  = (OutputWindow)window.Object; 
     OutputWindowPane outputWindowPane = null; 

     for (uint i = 1; i <= outputWindow.OutputWindowPanes.Count; i++) 
     { 
     if (outputWindow.OutputWindowPanes.Item(i).Name.Equals(OUTPUT_WINDOW_NAME , StringComparison.CurrentCultureIgnoreCase)) 
     { 
      outputWindowPane = outputWindow.OutputWindowPanes.Item(i); 
      break; 
     } 
     } 

     if (outputWindowPane == null) 
     outputWindowPane = outputWindow.OutputWindowPanes.Add(OUTPUT_WINDOW_NAME); 

     outputWindowPane.OutputString("Message"); 
Problemi correlati