我有几个使用
Debug.Assert(...)
的库。我认为 Debug.Assert(...)
很好,我仍然希望它们执行,但我不希望它们阻止我的应用程序的执行。理想情况下,我只希望将它们记录在某个地方。
鉴于我无法更改库的代码(并且我仍然想在调试中编译并运行断言),如何防止
Debug.Assert(...)
显示模式对话框?
此外,我想确保主程序在发生
Assert
时继续运行(与“忽略”按钮的行为相同)。
谢谢!
我不会推荐它。问题是
Debug.Assert
仅当代码中存在错误时才应该被解雇 。如果您只是忽略它们或不修复它们,那么您就是在伤害用户。另一方面,如果您针对那些 不是 的错误而解雇
Debug.Assert
,那么您也会对用户造成伤害(通过减少 Debug.Assert 的影响)。
话虽如此,您可以禁用它。您需要做的第一件事是从 Debug.Listeners 集合中删除默认侦听器:
Debug.Listeners.Clear();
然后,添加您自己的:
Debug.Listeners.Add(new MyTraceListener());
您需要创建一个继承自
TraceListener的类:
class MyTraceListener : TraceListener
{
// ...
public override void Fail(string msg, string detailedMsg)
{
// log the message (don't display a MessageBox)
}
}
重要的方法是
TraceListener.Fail方法,在DefaultTraceListener
的实现中就是显示消息框的。
Debug.Listeners.Clear()
.config:
<system.diagnostics>
<assert assertuienabled="false"/>
</system.diagnostics>
<assert>
元素将assertuienabled 属性设置为 false,并可选择为要写入的断言提供日志文件。 那么你就不必编写自己的监听器了。您可以在其
MSDN 页面阅读有关断言元素的更多信息。
这是一个完整的示例,您可以自行启用或禁用它
// Created By [email protected] at 2024-11-17 17:23:56+0800
using System.Diagnostics;
Application.SetCompatibleTextRenderingDefault(false);
Application.EnableVisualStyles();
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Trace.Listeners.Clear();
Trace.Listeners.Add(new MyTraceListener());
var form = new Form();
form.ClientSize = new Size(800, 450);
var button = new Button { Dock = DockStyle.Fill, Text = "CLICK ME" };
button.Click += delegate { Trace.Assert("Hello".StartsWith("World"), "Hello Should Starts With World!"); };
form.Controls.Add(button);
Application.Run(form);
internal class MyTraceListener : DefaultTraceListener
{
public override void Fail(string? message, string? detailMessage)
{
var stackTrace = new StackTrace(true).ToString();
var combinedMessage = $"{message}\n{detailMessage}".Trim();
var finalMessage = $"{combinedMessage}\n{stackTrace}".Trim();
var form = new Form();
form.StartPosition = FormStartPosition.CenterScreen;
form.ClientSize = new Size(800, 450);
form.Text = "Assertion Failed!";
form.Icon = SystemIcons.Error;
var label = new Label { Dock = DockStyle.Fill };
label.Text = finalMessage;
form.Controls.Add(label);
form.ShowDialog();
}
}