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

时间:2015-05-22 08:10:18

标签: c# visual-studio debugging

长话短说:我在项目中使用的一些第三方非托管dll显然在运行时将其错误转储到Visual Studio Output窗口(显示来自" 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,但没有成功。

3 个答案:

答案 0 :(得分:1)

有!您可以实现自己的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();

答案 1 :(得分:1)

这是一个非常有趣的问题。

我找到了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);
    }
}

某些Form.cs代码中的示例:

    public Form1()
    {
        InitializeComponent();

        StackOverflowSampleListener.Instance.InitializeTracing(true);

        StackOverflowSampleListener.Instance.Buffer.ToString();
    }

GuyMontag对他的回答是绝对正确的,但我更喜欢带有单例实现的较轻版本以及可能的收集消息也处于发布模式(查看初始化方法)。

答案 2 :(得分:1)

如果这是一个非托管dll,并且输出显示在Visual Studio输出窗口中,则表示它正在使用OutputDebugString函数来写入数据。

由于此数据仅用于调试,因此无法保证后续版本仍会输出此信息,或者保持相同的格式。 如果您不关心这一点,快速谷歌搜索'c#capture debug output'会产生this answer