当我从命令行提供参数时,我想让我的应用程序将所有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的子类,以便将assertion-failed-messages发送到控制台或调试文件:
// 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消息和断言消息都没有)都转到我的debugFile。我错过了什么?
答案 0 :(得分:1)
如果要禁止断言对话框,则需要清除现有的调试侦听器,因为DefaultTraceListener
负责该操作。
然后,添加您自己的TraceListener
实施,并覆盖Fail
方法,以及您在问题中显示的TextWriterTraceListener
实施。
为方便起见,只需子类DefaultTraceListener
并覆盖Fail
方法,以便不调用基本实现。
答案 1 :(得分: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个选项中止,重试和忽略。
我的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);