Как читать текст из окна вывода отладочной визуальной студии

Я прочитал несколько статей, в которых рассказывается, как добавить текст в окно вывода в Visual Studio из дополнения (в частности, из пакета интеграции Visual Studio 2008, через Visual Studio 2008 SDK 1.1), но нет примеров того, как читать текст из окна вывода. Моя цель - проанализировать текст из окна вывода отладки при отладке определенного приложения (вывод TRACE и, возможно, stdin/stdout). Интерфейс IVsOutputWindowPane не имеет методов для чтения текста из окна вывода. Документация, кажется, подразумевает, что это возможно, но она не дает пример:

http://msdn.microsoft.com/en-us/library/bb166236(VS.80).aspx

Цитата: Кроме того, объекты OutputWindow и OutputWindowPane добавляют некоторые функциональные возможности более высокого уровня, чтобы упростить перечисление панелей окна вывода и извлечение текста из панелей.

Предпочтительно я хотел бы иметь возможность подписаться на событие, которое срабатывает при поступлении новой строки текста, аналогично асинхронному чтению StreamReader.

4 ответа

Решение

Поведение по умолчанию (когда вы не устанавливаете слушателя явно) VS - отображать сообщения трассировки в окне вывода отладчика, что вам важно, если вы хотите простое решение и не выполняете никаких других действий с сообщениями.

К сожалению, это не ваш случай. Таким образом, вы должны определить слушателя трассировки для отправки (и сохранения) ваших сообщений трассировки, где вы сможете их прочитать. Прослушиватель трассировки может быть файлом (например, XML), или вы можете создать настраиваемый прослушиватель, извлекая класс из базового класса TraceListener, если вы не хотите беспокоиться о дополнительном файле.

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

ServiceProvider -> IVsOutputWindow -> GetPane (debugwindow) -> IVsUserData -> GetData (wpftextviewhost) -> IWpfTextViewHost -> IWpfTextView -> TextBuffer -> измененное событие.

Предполагая, что у вас есть VS IServiceProvider откуда-то еще (расширение vsix / что угодно, глобальный поставщик услуг) и без какой-либо проверки ошибок это выглядит так:

IVsOutputWindow outWindow = ServiceProvider.GetService(typeof(SVsOutputWindow)) as IVsOutputWindow;
Guid debugPaneGuid = VSConstants.GUID_OutWindowDebugPane;
IVsOutputWindowPane pane;
outWindow.GetPane(ref debugPaneGuid, out pane);
// from here up you'll find in lots of other stackru answers, 

// the stuff from here down is interesting to this question
IVsUserData userData = (IVsUserData)pane;
object o;
Guid guidViewHost = DefGuidList.guidIWpfTextViewHost;
userData.GetData(ref guidViewHost, out o);

IWpfTextViewHost viewHost = (IWpfTextViewHost)o;
IWpfTextView textView = viewHost.TextView;
textView.TextBuffer.Changed += YourTextChangedHandlerHere;

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

Весьма вероятно, что некоторые из вышеперечисленных даже не существовали в VS в 2010 году. Но это существует сейчас!

Я не знаю, что то, что вы спрашиваете, возможно. Но вы можете зарегистрировать свою надстройку в качестве отладчика для своего приложения, чтобы получать выходные данные трассировки. Обычно они направляются в OutputDebugString и могут быть записаны, как описано в этой статье: http://www.drdobbs.com/showArticle.jhtml?articleID=184410719. Он не дает нормального вывода, только отладку, но это не зависит от технологии отлаживаемого приложения.

Решение на этой странице выбирает текст, чтобы прочитать его. Я надеюсь, что есть лучший способ. Автоматически останавливать сборку Visual C++ 2008 при первой ошибке компиляции?

Private Sub OutputWindowEvents_OnPaneUpdated(ByVal pPane As OutputWindowPane) Handles OutputWindowEvents.PaneUpdated
    pPane.TextDocument.Selection.SelectAll()
    Dim Context As String = pPane.TextDocument.Selection.Text
    pPane.TextDocument.Selection.EndOfDocument()
End Sub
Другие вопросы по тегам