Есть еще одна хитрость: вы можете добавить поведение «выйти сейчас» через TraceListener, потому что сбои Debug.Assert вызывают вызов Fail () в слушателе трассировки.
Вам все еще нужно -define: DEBUG(и TRACE?).Лично я ожидаю, что вызовы Assert () (в сборках DEBUG) остановят мою программу, сбросят отладочную информацию и завершат работу.Итак, вот как я это делаю:
В своем коде я устанавливаю настраиваемый прослушиватель трассировки для дампа стека и добавляю вызов Exit ().И альт!У вас есть ответ промышленного стандарта на Assert.Fail ().Вы также можете, например, напечатать здесь метки времени и т. Д.
public class DumpStackTraceListener : TraceListener
{
public override void Write( string message )
{
Console.Write( message );
}
public override void WriteLine(string message)
{
Console.WriteLine( message );
}
public override void Fail(string message)
{
Fail( message, String.Empty );
}
public override void Fail(string message1, string message2)
{
if (null == message2)
message2 = String.Empty;
Console.WriteLine( "{0}: {1}", message1, message2 );
Console.WriteLine( "Stack Trace:" );
StackTrace trace = new StackTrace( true );
foreach (StackFrame frame in trace.GetFrames())
{
MethodBase frameClass = frame.GetMethod();
Console.WriteLine( " {2}.{3} {0}:{1}",
frame.GetFileName(),
frame.GetFileLineNumber(),
frameClass.DeclaringType,
frameClass.Name );
}
#if DEBUG
Console.WriteLine( "Exiting because Fail" );
Environment.Exit( 1 );
#endif
}
}
Объедините с вызовом по номеру:
#if DEBUG
Debug.Listeners.Add( new DumpStackTraceListener() );
#endif
И все готово.