2

当从命令行提供参数时,我想让我的应用程序将所有 Debug 和 Trace 输出重定向到文件和 Console.Out。对于普通Debug.WriteLine()消息,这个已经有效:

TextWriterTraceListener[] listeners = new TextWriterTraceListener[] {
                new TextWriterTraceListener(Console.Out),
                new TextWriterTraceListener(debugFile),
            };
            Debug.Listeners.AddRange(listeners);

但它不为Debug.Assert(condition, "message")

如何Debug.Assert()像对输出一样重定向Debug.WriteLine()输出?

编辑:

我添加了 TextWriterTraceListener 的子类,以便将断言失败消息发送到控制台或调试文件:

// used to redirect assert debug messages
private class AssertTraceListener : TextWriterTraceListener
{
    public AssertTraceListener(TextWriter w) : base(w) {}
    public AssertTraceListener(String s) : base(s) {}

    public override void Fail(string message)
    {
        // uncomment if you want the modal dialog
        //base.Fail(message);
        WriteLine(message);
    }
}

我现在这样称呼他们:

    TextWriterTraceListener[] twlisteners = new TextWriterTraceListener[] {
        new TextWriterTraceListener(Console.Out),
        new TextWriterTraceListener(debugFile)
    };
    AssertTraceListener[] listeners = new AssertTraceListener[] {
        new AssertTraceListener(Console.Out),
        new AssertTraceListener(debugFile)
    };
    Debug.Listeners.Clear();
    Debug.Listeners.AddRange(listeners);
    Debug.Listeners.AddRange(twlisteners);

debugFile包含有效路径,但我的任何消息(既不是 Debug.WriteLine 消息也不是断言消息)都不会进入我的调试文件。我错过了什么?

4

2 回答 2

1

如果您想抑制断言对话框,那么您需要清除现有的调试侦听器,因为它们DefaultTraceListener对此负责。

然后,添加您自己的实现TraceListener并覆盖这些Fail方法,以及TextWriterTraceListener您在问题中显示的实现。

为方便起见,只需以不调用基本实现的方式子类DefaultTraceListener化和覆盖方法。Fail

于 2013-10-15T14:57:43.983 回答
0

我现在能够自己修复它。我的问题是,我的一个自定义 TraceListener 不会将消息写入我在 ctor 中传递给它的文件。

这是我现在的代码:

private class AssertTextWriterTraceListener : TextWriterTraceListener
{
    public AssertTextWriterTraceListener(TextWriter w) : base(w) {}
    public AssertTextWriterTraceListener(String s) : base(s) {}

    public override void Fail(string message)
    {
        // uncomment if you want the modal dialog
        //base.Fail(message);
        WriteLine(message);
    }
}

请注意,我注释掉了对base.Fail(message). 如果调用被传递到基类,一个模式对话框将弹出一个失败的断言,提供 3 个选项 abort、retry 和 ignore。

我的 main 方法中的代码如下所示:

    AssertTextWriterTraceListener fileTL = new AssertTextWriterTraceListener(debugFile);
    AssertTextWriterTraceListener consoleTL = new AssertTextWriterTraceListener(Console.Out);
    System.Diagnostics.Trace.AutoFlush = true; // necessary to get the Debug-Messages flushed to the debugFile
    // clearing the default listener and adding the custom ones.
    Debug.Listeners.Clear();
    Debug.Listeners.Add(fileTL);
    Debug.Listeners.Add(consoleTL);
于 2013-10-16T20:21:11.673 回答