Как написать в окно вывода в надстройке Visual Studio 2010?

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

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

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

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

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


person Eric Brown - Cal    schedule 14.10.2011    source источник


Ответы (3)


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

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

person John Cornell    schedule 14.10.2011
comment
Что такое объект dte? (сейчас читаю документы, но было бы неплохо в ответе для дальнейшего использования) - person Eric Brown - Cal; 17.10.2011
comment
Для тех, кто следит, dte определяется в методе connect.cs при подключении. Ищите это внизу файла: private DTE2 _applicationObject; Используйте это как dte - person Eric Brown - Cal; 17.10.2011

Как указал Роберт, код Джона выдаст исключение, если 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" );
person David Cardinale    schedule 14.05.2013

Я пишу надстройку 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");
person robert evans    schedule 09.08.2012