是否有可能在我的应用程序中显示VS输出窗口内容

本文关键字:输出 VS 窗口 显示 有可能 我的 应用程序 是否 | 更新日期: 2023-09-27 17:50:19

长话短说:我在项目中使用的一些第三方非托管dll,显然在运行时将其错误转储到Visual Studio输出窗口(显示"Debug"的输出)。它看起来像这样:

 *** WARNING  ERROR 11 from R3ORP.  The degree 0 polynomial fit is a perfect
 ***          fit within machine precision.
     Here is a traceback of subprogram calls in reverse order:
     Routine name                    Error type  Error code
     ------------                    ----------  ----------
     R3ORP                                6          11    (Called internally)
     R4ORP                                0           0    (Called internally)
     R2ORP                                0           0    (Called internally)
     R2URV                                0           0    (Called internally)
     RCURV                                0           0
     USER                                 0           0

我想记录这些错误或在我的应用程序中显示它们。是否有可能以某种方式从我的应用程序访问VS输出流?我还能在没有VS的情况下做吗?我不需要整个流,但我想以某种方式捕获这些"警告"。我试过在Diagnostics.DebugDiagnostics.Trace中添加监听器,但没有成功。

是否有可能在我的应用程序中显示VS输出窗口内容

有!你可以实现你自己的TraceListener-Class。

首先写TraceListener-Class:

class CustomTraceListener : TraceListener
{
    public string  AllMessages { get; set; }
    public override void Write(string message)
    {
        AllMessages += message;
    }
    public override void WriteLine(string o)
    {
        Write(o + ''n');
    }
    public override string ToString()
    {
        return AllMessages;
    }
}

你可以在Write()方法中实现自定义行为(如写入文本框等)。

然后你只需要把你的类的一个实例添加到系统的调试跟踪侦听器中,就可以了:

CustomTraceListener myTraceListener = new CustomTraceListener();
Debug.Listeners.Add(myTraceListener);
Debug.WriteLine("this is a test");
Debug.WriteLine("this is another test");
string result = myTraceListener.ToString();

如果这是一个非托管的dll,并且输出出现在Visual Studio输出窗口中,这意味着它正在使用OutputDebugString函数来写入数据。

由于此数据仅用于调试,因此不能保证后续版本仍将输出此信息,或坚持相同的格式。如果你不关心这个问题,在谷歌上快速搜索一下"c#捕获调试输出"就会得到这个答案。

这真是一个有趣的问题。

我找到了System.Diagnostics.TraceListener类的解决方案。

sealed class StackOverflowSampleListener : TraceListener
{
    // Singleton 
    public static readonly StackOverflowSampleListener Instance =
      new StackOverflowSampleListener();
    public void InitializeTracing(bool ReadDebugOutput)
    {
         if (ReadDebugOutput == true)
            Debug.Listeners.Add(this);
        else
            Trace.Listeners.Add(this);
    }
    public StringBuilder Buffer = new StringBuilder();
    public override void Write(string message)
    {
        // Do something with your messages!
        Buffer.Append(message);
    }
    public override void WriteLine(string message)
    {
        // Do something with your messages!
        Buffer.Append(message);
    }
}

示例:

    public Form1()
    {
        InitializeComponent();
        StackOverflowSampleListener.Instance.InitializeTracing(true);
        StackOverflowSampleListener.Instance.Buffer.ToString();
    }

GuyMontag的回答是绝对正确的,但我更喜欢一个更轻的版本,带有单例实现,并且可能在发布模式下收集消息(看看initialize方法)。