2011-10-14 14 views
11

Estoy escribiendo un simple complemento de Visual Studio 2010 para hacer un trabajo de copia común aquí en el trabajo (obteniendo dlls de libs sln).¿Cómo escribo en la ventana de salida en Visual Studio 2010 AddIn?

Quiero que el progreso de la copia se escriba en la ventana de salida.

Probé Trace.WriteLine(...) esperando que lo haga, pero no ocurre cuando ejecuto el complemento en el depurador. No lo he intentado de otra manera todavía.

Encontré algunos ejemplos de hacerlo en Visual Studio 2008, pero las librerías necesarias no están disponibles para referenciar.

¿Alguien me puede indicar cómo escribir en la ventana de resultados? Mis habilidades de Google me han fallado.

Respuesta

16

He hecho esto para una macro que escribí:

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

Aquí hay un enlace para la interfaz DTE: http://msdn.microsoft.com/en-us/library/envdte.dte(v=VS.100).aspx

+0

¿Cuál es el objeto dte? (leyendo documentos ahora, pero sería bueno en la respuesta para referencia futura) –

+1

Para aquellos que siguen, dte, se define en connect.cs, en el método de conexión. Busque esto en la parte inferior del archivo: private DTE2 _applicationObject; Úselo como dte –

+0

Esto funcionó para mí :) – Achilles

1

Estoy escribiendo un estudio visual de complemento y tenía el mismo problema, sin embargo, al intentar la respuesta anterior encontré que la línea:

outputWindow.ActivePane.Activate(); 

dio un error.

NullReferenceException - Referencia de objeto no establecida en una instancia de un objeto.

sin embargo he encontrado ahora una forma ligeramente diferente para resolver el 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

Como señaló Robert, código de John será una excepción cuando no hay ActivePane. Si hay un panel activo, usará el panel que esté activo.

Un problema que tengo con el ejemplo de Robert depende de dónde se crea el panel, que en mi caso es el método Exec, creará varios paneles con el mismo nombre cada vez que se ejecute.

Incluyendo mi ejemplo de cómo solucioné ese problema. Muy simple, simplemente compruebe la existencia de la ventana primero ...

 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"); 
Cuestiones relacionadas