C# 如何从VisualStudio调试输出窗口读入文本

C# 如何从VisualStudio调试输出窗口读入文本,c#,visual-studio-2008,vsx,C#,Visual Studio 2008,Vsx,我读过几篇文章,告诉您如何通过VisualStudio2008SDK 1.1从一个附加组件(特别是VisualStudio2008集成包)中向VisualStudio中的输出窗口添加文本,但没有关于如何从输出窗口读取文本的示例。我的目标是在调试某个应用程序跟踪输出以及可能的stdin/stdout时,解析调试输出窗口中的文本。IVsOutputWindowPane接口没有从输出窗口读取文本的方法。文档似乎暗示这是可能的,但并未提供示例: Quote:此外,OutputWindow和OutputW

我读过几篇文章,告诉您如何通过VisualStudio2008SDK 1.1从一个附加组件(特别是VisualStudio2008集成包)中向VisualStudio中的输出窗口添加文本,但没有关于如何从输出窗口读取文本的示例。我的目标是在调试某个应用程序跟踪输出以及可能的stdin/stdout时,解析调试输出窗口中的文本。IVsOutputWindowPane接口没有从输出窗口读取文本的方法。文档似乎暗示这是可能的,但并未提供示例:

Quote:此外,OutputWindow和OutputWindowPane对象添加了一些更高级的功能,使枚举输出窗口窗格和从窗格中检索文本变得更容易


我希望能够订阅一个事件,该事件在新行文本到达时触发,类似于StreamReader的异步读取。

如果不明确设置VS的侦听器,默认行为是在调试器输出窗口中显示跟踪消息,若你们想要一个简单的解决方案,并且不做其他按摩动作,你们会很感激的


不幸的是,这不是你的情况。因此,您必须定义一个跟踪侦听器来发送和存储跟踪消息,然后才能读取它们。跟踪侦听器可以是一个文件,例如XML,或者如果您不想为其他文件而烦恼,可以通过从基类TraceListener派生一个类来创建自定义侦听器。

如果您不显式地将侦听器设置为VS,则默认行为是在调试器输出窗口中显示跟踪消息,若你们想要一个简单的解决方案,并且不做其他按摩动作,你们会很感激的


不幸的是,这不是你的情况。因此,您必须定义一个跟踪侦听器来发送和存储跟踪消息,然后才能读取它们。跟踪侦听器可以是一个文件,例如XML,或者如果您不想为其他文件而烦恼,您可以通过从基类TraceListener派生一个类来创建自定义侦听器。

我不知道您的要求是否可行。但是,您可以将外接程序注册为应用程序的调试器,以便获得跟踪消息的输出。它们通常被路由到OutputDebugString,并且可以按照本文所述进行捕获:。它不提供正常的输出,只提供调试,但它不依赖于已调试应用程序的技术。

我不知道您的要求是否可行。但是,您可以将外接程序注册为应用程序的调试器,以便获得跟踪消息的输出。它们通常被路由到OutputDebugString,并且可以按照本文所述进行捕获:。它不提供正常的输出,只提供调试,但它不依赖于已调试应用程序的技术。

此页上的解决方案选择文本以便读取。我希望有更好的办法。


此页上的解决方案选择文本以便阅读。我希望有更好的办法。


有可能,这只是一条长长的蜿蜒之路:

ServiceProvider->IVsOutputWindow->GetPane调试窗口->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 stackoverflow 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;
每次输出窗口获得更多数据时,就会调用文本更改处理程序。你不一定会一行一行地得到它,但你很可能会得到你需要自己处理的大块东西


2010年,VS中很可能不存在上述部分内容。但它现在已经存在了

这是可能的,只是一条长长的蜿蜒之路:

ServiceProvider->IVsOutputWindow->GetPane调试窗口->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 stackoverflow 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;
每次输出窗口获得更多数据时,就会调用文本更改处理程序。你不一定会一行一行地得到它,但你很可能会得到你需要自己处理的大块东西


2010年,VS中很可能不存在上述部分内容。但它现在已经存在了

跟踪侦听器如何捕获输出窗口中的内容?编辑得不错,但tracelistener只捕获跟踪消息。这并不是输出窗口的全部内容。好的,这是真的。如果这对用户来说足够,他可以使用这个解决方案,但我承认这不是解决问题的方法
获取输出窗口中写入的所有内容。我会对能够捕获跟踪输出感到满意,但文档似乎暗示可以直接访问输出窗口窗格文本。请参见编辑我的原始帖子。如果确实可行,那将是更好的解决办法。文件是否完全不正确/误导?这不会让我感到惊讶。仅仅4年后,我确实找到了一种不用使用IWPTextView的线程就可以做到这一点的方法,而IWPTextView可能在2010年就不存在了:跟踪侦听器如何捕获输出窗口中的内容?编辑得不错,但tracelistener仍然只能捕获跟踪消息。这并不是输出窗口的全部内容。好的,这是真的。如果这对用户来说已经足够了,他可以使用这个解决方案,但我承认这不是获取输出窗口中写入的所有内容的方式。我会对能够捕获跟踪输出感到满意-但文档似乎暗示可以直接访问输出窗口窗格文本。请参阅编辑到我的原始帖子。如果确实可行,那将是更好的解决办法。文件是否完全不正确/误导?这不会让我感到惊讶。仅仅4年后,我就找到了一种不用使用IWPTextView的线程来实现这一点的方法,而IWPTextView在2010年可能根本不存在: