2010-05-18 5 views
21

J'ai quelques bibliothèques qui utilisent Debug.Assert(...). Je pense que les Debug.Assert(...) vont bien et je veux encore qu'ils s'exécutent, mais je ne veux pas qu'ils bloquent l'exécution de mon application. Idéalement, je voudrais seulement qu'ils soient connectés quelque part. Étant donné que je ne peux pas changer le code des bibliothèques (et que je veux encore compiler dans le débogage et exécuter l'assertion), comment puis-je empêcher Debug.Assert(...) d'afficher un dialogue modal?Comment empêcher Debug.Assert (...) d'afficher un dialogue modal

En outre, je voudrais m'assurer que le programme principal continue quand un Assert se produit (même comportement que le bouton Ignorer).

Merci!

+0

drôle personne n'a mentionné ici, mais 'Debug.Assert()' ne se termine pas dans votre compilé application (lorsque vous le déployez en mode Release). Ceci est strictement un outil de débogage et n'affectera pas les utilisateurs finaux. Mais comme mentionné, si vous ne réparez pas les assertions, de mauvaises choses peuvent se produire dans votre application. – NightOwl888

Répondre

23

Je ne le recommanderais pas. Le problème est que Debug.Assert est seulement supposé être déclenché lorsque vous avez des bugs dans votre code. Si vous les ignorez ou si vous ne les réparez pas, vous faites du tort à vos utilisateurs. Si, d'autre part, vous tirez Debug.Assert pour des choses que ne sont pas bugs, alors vous faites également un mauvais service à vos utilisateurs (en réduisant l'impact de Debug.Assert). Cela dit, peut le désactiver. La première chose que vous devez faire est de supprimer l'auditeur par défaut de la collection Debug.Listeners:

Debug.Listeners.Clear(); 

Ensuite, ajoutez votre place:

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

Vous devez créer une classe qui hérite de TraceListener:

class MyTraceListener : TraceListener 
{ 
    // ... 

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

la méthode importante est la méthode TraceListener.Fail, qui, dans la mise en œuvre de DefaultTraceListener est ce qui affiche la boîte de message.

+0

Cela fonctionne parfaitement, mais lorsqu'une assertion échoue, le code ne continue pas à s'exécuter. Je veux que ça continue. Une idée de comment je peux faire ça? – Martin

+1

+1 bien expliqué. –

+2

@Martin Le point des affirmations est de tirer quand il y a des bugs. Si une affirmation est renvoyée, l'exécution est censée s'arrêter car le résultat n'est pas prévisible.Vous essayez d'abuser des affirmations et devriez vous en tenir à votre propre enregistreur. –

5

Codekas réponse est correcte, si vous voulez frapper les choses avec un très gros marteau. Vous pouvez utiliser l'élément <assert> dans votre fichier de configuration d'application pour définir la propriété assertuienabled sur false et, éventuellement, attribuer un fichier journal aux assertions dans lesquelles écrire. Alors vous n'aurez pas à écrire votre propre auditeur. Vous pouvez en savoir plus sur l'élément assert à MSDN page.

+0

Cela fonctionne parfaitement, mais lorsqu'une assertion échoue, le code ne continue pas à fonctionner. Je veux que ça continue. Une idée de comment je peux faire ça? – Martin

+0

@Martin Assez vieux sujet ici, mais pourquoi voulez-vous continuer, si vous avez des bugs dans votre code? Je veux dire, quelle est votre attente d'un mauvais résultat, parce que l'une de vos hypothèses est fausse? –

11

Il n'y a pas besoin de Debug.Listeners.Clear()

Il suffit d'ajouter à votre .config:

<system.diagnostics> 
    <assert assertuienabled="false"/> 
</system.diagnostics>