C# 重定向Debug.Assert()输出

C# 重定向Debug.Assert()输出,c#,debugging,C#,Debugging,当从命令行提供参数时,我想让我的应用程序将所有调试和跟踪输出重定向到文件和Console.Out。 对于正常的Debug.WriteLine()消息,此消息已起作用: TextWriterTraceListener[] listeners = new TextWriterTraceListener[] { new TextWriterTraceListener(Console.Out), new TextWriterTraceLis

当从命令行提供参数时,我想让我的应用程序将所有调试和跟踪输出重定向到文件和Console.Out。 对于正常的
Debug.WriteLine()
消息,此消息已起作用:

TextWriterTraceListener[] listeners = new TextWriterTraceListener[] {
                new TextWriterTraceListener(Console.Out),
                new TextWriterTraceListener(debugFile),
            };
            Debug.Listeners.AddRange(listeners);
但它不适用于
Debug.Assert(条件,“消息”)

如何像处理
Debug.WriteLine()
输出那样重定向
Debug.Assert()
的输出

编辑:

我添加了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消息和assert消息)都不会转到我的debugFile。我遗漏了什么?

如果要抑制断言对话框,则需要清除现有的调试侦听器,因为
DefaultTraceListener
对此负责

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


为了方便起见,只需子类化
DefaultTraceListener
并重写
Fail
方法,这样就不会调用基本实现。

我现在可以自己修复它了。我的问题是,我的一个自定义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);

@弗拉基米尔罗夫我现在编辑了我的问题。我知道,我的第一个版本看起来像是重复的,但我认为它现在有点专业化了,应该保持打开状态。为了让侦听器在其ctor中接受文本编写器或文件名并向其写入断言消息,我必须做些什么?我刚刚将TextWriterTraceListener子类化,为任一输入类型创建了两个构造函数,并在Fail(string)方法中添加了一个简单的WriteLine语句,该语句应该调用基类中的WriteLine方法,对吗?(我将在我的问题中添加我的代码)@wullxz,你想将文本编写器传递给哪个侦听器?如果是您自己的实现,是什么阻止您添加必要的构造函数?如果在实现中附加一个断点,它是否会像您预期的那样被命中?正如您在我的问题(昨天编辑)中看到的,我已经添加了这两个断点。我想把它传递给我自己的派生类
AssertTraceListener