How to prevent Debug.Assert(...) to show a modal dialog

.net, assert, c#, c#-4.0, visual-studio

Solution

I wouldn't recommend it. The problem is that `Debug.Assert` is only supposed to be fired when you have bugs in your code. If you just ignore them or don't fix them, then you are doing your users a disservice. If, on the other hand, you're firing `Debug.Assert` for things that aren't bugs, then you're also doing your users a disservice (by reducing the impact of Debug.Assert).

Having said that, you can disable it. The first thing you need to do is remove the default listener from the Debug.Listeners collection:

Debug.Listeners.Clear();

Then, add your own instead:

Debug.Listeners.Add(new MyTraceListener());

You need to create a class that inherits from TraceListener:

class MyTraceListener : TraceListener
{
    // ...

    public override void Fail(string msg, string detailedMsg)
    {
        // log the message (don't display a MessageBox)
    }
}

The important method is the TraceListener.Fail method, which in the implementation of `DefaultTraceListener` is what displays the message box.

Problem

I have a couple of libraries which use `Debug.Assert(...)`. I think that the `Debug.Assert(...)` are fine and I still want them to execute, but I don't want them to block the execution of my application. Ideally, I would only like them to be logged somewhere. Given that I can't change the code of the libraries (and that I still want to compile in debug and run the assertion), how do I prevent `Debug.Assert(...)` to show a modal dialog? In addition, I would like to make sure that the main program continues when an `Assert` occurs (same behavior as the Ignore button). Thanks!

Original source