2009-09-10 6 views
10

Je veux que mes commandes Console.WriteLine() apparaissent dans ma fenêtre "Sortie" avec mes instructions Debug.WriteLine(). Je pense que j'ai compris comment faire une fois mais je ne me souviens pas/trouver sur google comment le faire à nouveau. Je me souviens d'être en mesure de le faire dans le app.configrediriger la console vers la fenêtre de sortie Visual Studio Debug dans app.config

Je trouve beaucoup d'instructions sur la façon de parier la console et les déclarations de débogage à apparaître dans la sortie de la console, mais pas comment les faire apparaître dans le " Sortie "fenêtre.

Quelqu'un sait-il?

Répondre

18

Fondamentalement, la solution la plus simple ressemble à ceci.

public class ToDebugWriter : StringWriter 
    { 
     public override void WriteLine(string value) 
     { 
      Debug.WriteLine(value); 
      base.WriteLine(value); 
     } 
    } 

et vous devez ajouter à l'initialisation du programme cette ligne "Console.SetOut (nouvelle ToDebugWriter());"

+0

Bonne réponse. Merci! –

+1

Merde! Je peux enfin voir mes requêtes NHibernate sur Visual Studio! –

+0

Merci! Pourquoi s'embêter avec l'appel de 'base.WriteLine'? –

1

Si vous pouvez obtenir le flux pour la fenêtre de sortie, vous pouvez utiliser Console.SetOut() pour vous y rediriger. Cependant, cette approche ne semble pas possible.

System.Debug sort à TraceListener dans TraceListenerCollection. Il n'y a qu'un seul TraceListener enregistré initialement qui est le DefaultTraceListener. Il n'utilise pas d'objet stream et utilise à la place des méthodes natives pour la sortie.

Une approche qui utilise l'API Visual Studio est probablement le chemin à parcourir.

3

@Avram's answer a travaillé pour moi, sauf que la surcharge unique dans son code n'était pas celle que ConsoleAppender de log4net utilisait sur mon système. (Je suis intéressé par Console.SetOut de sorte que les sorties de log4net ConsoleAppender à la fenêtre de sortie « Debug » de Visual Studio.) Je l'emportaient sur tous Write et WriteLine méthodes de StringWriter accepter string, object, char[], etc. sur l'hypothèse que l'un ou plusieurs de ceux-ci était ce que ConsoleAppender appelait par Console.

Cela a réussi, et la journalisation log4net apparaît maintenant dans mon volet "Debug". J'inclus le code ci-dessous pour le bénéfice de toute personne ayant des objectifs similaires. (Pour être entièrement sûr, on peut remplacer les méthodes StringWriter.Write et restantes.) J'ai supprimé les appels à base parce qu'ils semblent être inutiles, et je pense qu'ils construisent juste un grand tampon à l'intérieur de StringWriter (généralement accessible via cette classe de .ToString().)

namespace GeneralLibrary.Logging 
{ 
    using System.Diagnostics; 
    using System.IO; 

    public class DebugWriter : StringWriter 
    { 
     public override void Write(string format, object arg0) 
     { 
      Debug.Write(string.Format(format, arg0)); 
     } 

     public override void Write(string format, object arg0, object arg1) 
     { 
      Debug.Write(string.Format(format, arg0, arg1)); 
     } 

     public override void Write(string format, object arg0, object arg1, object arg2) 
     { 
      Debug.Write(string.Format(format, arg0, arg1, arg2)); 
     } 

     public override void Write(string format, params object[] arg) 
     { 
      Debug.Write(string.Format(format, arg)); 
     } 

     public override void Write(object value) 
     { 
      Debug.Write(value); 
     } 

     public override void Write(string value) 
     { 
      Debug.Write(value); 
     } 

     public override void Write(char[] buffer) 
     { 
      Debug.Write(buffer); 
     } 

     public override void Write(char[] buffer, int index, int count) 
     { 
      Debug.Write(new string(buffer, index, count)); 
     } 

     public override void WriteLine(string value) 
     { 
      Debug.WriteLine(value); 
     } 

     public override void WriteLine(object value) 
     { 
      Debug.WriteLine(value); 
     } 

     public override void WriteLine(string format, object arg0) 
     { 
      Debug.WriteLine(format, arg0); 
     } 

     public override void WriteLine(string format, object arg0, object arg1) 
     { 
      Debug.WriteLine(format, arg0, arg1); 
     } 

     public override void WriteLine(string format, object arg0, object arg1, object arg2) 
     { 
      Debug.WriteLine(format, arg0, arg1, arg2); 
     } 

     public override void WriteLine(string format, params object[] arg) 
     { 
      Debug.WriteLine(format, arg); 
     } 

     public override void WriteLine(char[] buffer) 
     { 
      Debug.WriteLine(buffer); 
     } 

     public override void WriteLine(char[] buffer, int index, int count) 
     { 
      Debug.WriteLine(new string(buffer, index, count)); 
     } 

     public override void WriteLine() 
     { 
      Debug.WriteLine(string.Empty); 
     } 
    } 
} 
Questions connexes