2009-09-10 11 views
10

Desidero visualizzare i miei comandi nella finestra "Output" con le mie istruzioni Debug.WriteLine(). Penso di aver capito come farlo una volta ma non riesco a ricordare/trovare su google come farlo di nuovo. Mi sembra di ricordare di essere in grado di fare questo nel app.configreindirizza la console alla finestra di output di debug di Visual Studio in app.config

trovo un sacco di istruzioni su come scommettere dichiarazioni di console e di debug a comparire in l'uscita della console, ma non come per farli apparire nel " Uscita "finestra.

Qualcuno sa?

risposta

18

Fondamentalmente la soluzione più semplice assomiglia a questo.

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

ed è necessario aggiungere alla inizializzazione del programma di questa linea "Console.SetOut (nuova ToDebugWriter());"

+0

Buona risposta. Grazie! –

+1

Dannazione! Finalmente riesco a vedere le mie query su NHibernate su Visual Studio! –

+0

Grazie! Perché preoccuparsi della chiamata a 'base.WriteLine'? –

1

Se è possibile ottenere il flusso per la finestra di output, è possibile utilizzare Console.SetOut() per reindirizzare ad esso. Tuttavia questo approccio non sembra essere possibile.

System.Debug uscite su ogni TraceListener nella sua TraceListenerCollection. C'è inizialmente un solo TraceListener registrato che è il DefaultTraceListener. Non fa uso di un oggetto flusso e utilizza invece metodi nativi per l'output.

Un approccio che utilizza l'API di Visual Studio è probabilmente la strada da percorrere.

3

@Avram's answer ha funzionato per me, tranne che il sovraccarico singolo nel suo codice non era quello che ConsoleAppender di log4net stava usando sul mio sistema. (Mi interessa Console.SetOut modo ConsoleAppender uscite di log4net a riquadro di Visual Studio "Debug" in uscita.) Quindi ho prevarrebbero tutti Write e WriteLine metodi StringWriter s' accettare string, object, char[], ecc sul presupposto che uno o più di questi era quello che ConsoleAppender stava chiamando tramite Console.

Questa operazione è riuscita e la registrazione di log4net ora viene visualizzata nel riquadro "Debug".

Inserisco il codice seguente a beneficio di chiunque abbia obiettivi simili. (Per essere del tutto sicuri, uno potrebbe ignorare i restanti metodi StringWriter.Write e .WriteLine.) Ho rimosso le chiamate a base perché sembrano non necessarie e penso che si limitino a creare un buffer di grandi dimensioni all'interno di StringWriter (generalmente accessibile tramite quella classe .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); 
     } 
    } 
} 
Problemi correlati