2013-10-15 3 views
2

Je souhaite que mon application redirige toutes les sorties de débogage et de trace vers un fichier et vers la console.Out lorsqu'un paramètre est fourni à partir de la ligne de commande. Pour Debug.WriteLine() normaux messages, celui-ci fonctionne déjà:Rediriger la sortie Debug.Assert()

TextWriterTraceListener[] listeners = new TextWriterTraceListener[] { 
       new TextWriterTraceListener(Console.Out), 
       new TextWriterTraceListener(debugFile), 
      }; 
      Debug.Listeners.AddRange(listeners); 

Mais il ne fonctionne pas Debug.Assert(condition, "message").

Comment puis-je rediriger la sortie de Debug.Assert() comme je l'ai fait avec la sortie Debug.WriteLine()?

Edit:

J'ai ajouté une sous-classe de TextWriterTraceListener afin d'envoyer des messages d'assertion a échoué à la console ou un fichier de débogage:

// 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); 
    } 
} 

Je les appelle comme ça maintenant:

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 contient un chemin valide, mais aucun de mes messages (ni messages, ni Debug.WriteLine faire valoir les messages) aller à mon debugfile. Qu'est-ce que je rate?

+0

http://stackoverflow.com/questions/2854024/how-to-prevent-debug-assert-to-show-a-modal- dialog – Vladimir

+0

@VladimirFrolov J'ai modifié ma question maintenant. Je sais, ma première version ressemblait à un doublon, mais je pense que c'est maintenant un peu plus spécialisé et mérite d'être laissé ouvert. – wullxz

Répondre

0

J'ai été capable de le réparer moi-même maintenant. Mon problème était que l'un de mes TraceListeners personnalisés n'écrirait pas les messages dans le fichier que je lui ai transmis dans le ctor.

Ceci est mon code maintenant:

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); 
    } 
} 

Notez que je commentais l'appel à base.Fail(message). Si l'appel est passé dans la classe de base, une boîte de dialogue modale apparaîtra sur une assertion ayant échoué offrant les 3 options abandonner, réessayer et ignorer.

Le code dans ma principale méthode ressemble à ceci:

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); 
1

Si vous souhaitez supprimer la boîte de dialogue d'assertion, vous devrez effacer les écouteurs de débogage existants car le DefaultTraceListener en est responsable.

Ensuite, ajoutez votre propre implémentation de TraceListener et remplacez les méthodes Fail, ainsi que les implémentations TextWriterTraceListener que vous affichez dans votre question. Par commodité, il suffit de sous-classer DefaultTraceListener et de remplacer les méthodes Fail de sorte que les implémentations de base ne soient pas appelées.

+0

Que dois-je faire pour laisser l'écouteur accepter TextWriters ou FileNames dans son ctor et lui écrire les messages d'assertions? Je viens de sous-classer TextWriterTraceListener, créé deux cteurs pour l'un des types d'entrée et ajouté une instruction WriteLine simple dans la méthode Fail (string) qui devrait appeler la méthode WriteLine dans la baseclass, n'est-ce pas? (Je vais ajouter mon code à ma question) – wullxz

+0

@ wullxz, quel écouteur voulez-vous passer un TextWriter? Si c'est votre propre implémentation, qu'est-ce qui vous empêche d'ajouter le constructeur nécessaire? Si vous attachez un point d'arrêt à votre implémentation, est-ce que vous l'atteignez comme prévu? –

+0

J'ai ajouté les deux, comme vous pouvez le voir dans ma question (édité hier). Je voudrais le passer à ma propre classe dérivée 'AssertTraceListener'. – wullxz