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

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

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

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

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

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

Ответ 1

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

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

Ответ 2

Как заметил Роберт, код Джона будет генерировать исключение, если нет 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" );

Ответ 3

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