Как записать в окно вывода в надстройке Visual Studio 2010? - PullRequest
11 голосов
/ 15 октября 2011

Я пишу простую надстройку Visual Studio 2010, чтобы выполнять обычное копирование здесь, на работе (получение dll от libs sln).

Я хочу, чтобы процесс копирования записывался в окно вывода.

Я пытался Trace.WriteLine(...), ожидая, что это произойдет, но это не так, когда я запускаю надстройку в отладчике. Я еще ни разу не пробовал.

Я нашел несколько примеров этого в Visual Studio 2008, но необходимые библиотеки не доступны для ссылки.

Может кто-нибудь указать мне, как записать в окно вывода? Мои навыки поиска в Google подвели меня.

Ответы [ 3 ]

16 голосов
/ 15 октября 2011

Я сделал это для макроса, который я написал:

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

Вот ссылка на интерфейс DTE: http://msdn.microsoft.com/en-us/library/envdte.dte(v=VS.100).aspx

8 голосов
/ 14 мая 2013

Как указал Роберт, код Джона выдаст исключение, когда ActivePane отсутствует. Если есть активная панель, она будет использовать любую активную панель.

Одна проблема, с которой я столкнулся в примере с Робертом, связана с тем, где вы создаете панель. В моем случае это метод Exec, он будет создавать несколько панелей с одинаковым именем при каждом запуске.

Включая мой пример того, как я справился с этой проблемой. Довольно просто, просто сначала проверьте наличие окна ...

      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" );
1 голос
/ 09 августа 2012

Я пишу надстройку для Visual studio, и у меня возникла та же проблема, однако, пытаясь ответить выше, я обнаружил, что строка:

outputWindow.ActivePane.Activate();

выдает ошибку.

NullReferenceException - Ссылка на объект не установлена ​​для экземпляра объекта.

Однако теперь я нашел немного другой способ решения проблемы:

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