2009-09-10 7 views
10

Ich möchte meine Console.WriteLine() Befehle in meinem "Output" -Fenster mit meinen Anweisungen angezeigt werden. Ich denke, ich habe herausgefunden, wie man das einmal macht, aber ich kann mich nicht erinnern/finde auf google, wie man es wieder macht. Ich scheine in der Lage, dies zu tun in den app.configRedirect-Konsole zu Visual Studio-Debug-Ausgabefenster in app.config

Ich finde viele Anweisungen zu erinnern, wie Konsole und Debug-Anweisungen wetten, in der Ausgabe der Konsole erscheinen, aber nicht, wie sie in dem "erscheinen zu bekommen Ausgabe "Fenster.

Weiß jemand?

Antwort

18

Grundsätzlich sieht die einfachste Lösung so aus.

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

und Sie müssen diese Zeile auf die Initialisierung des Programms hinzufügen "Console.SetOut (neu ToDebugWriter());"

+0

Gute Antwort. Vielen Dank! –

+1

Verdammt! Endlich kann ich meine NHibernate-Abfragen in Visual Studio sehen! –

+0

Danke! Warum sollten Sie sich mit dem Aufruf von 'base.WriteLine' beschäftigen? –

1

Wenn Sie den Stream für das Ausgabefenster erhalten können, können Sie Console.SetOut() verwenden, um darauf umzuleiten. Dieser Ansatz scheint jedoch nicht möglich zu sein.

System.Debug Ausgänge zu jedem TraceListener in seiner TraceListenerCollection. Es ist nur ein TraceListener registriert, der die DefaultTraceListener ist. Es verwendet kein Stream-Objekt und verwendet stattdessen native Methoden für die Ausgabe.

Ein Ansatz, der die Visual Studio API verwendet, ist wahrscheinlich der Weg zu gehen.

3

@Avram's answer hat für mich gearbeitet, außer dass die einzelne Überlastung in seinem Code war nicht die, die log4net ConsoleAppender auf meinem System verwendet wurde. (Ich bin interessiert an Console.SetOut so dass log4net der ConsoleAppender Ausgänge zu Visual Studio „Debug“ Ausgabebereich.) Also ich overrode all StringWriter ‚s Write und WriteLine Methoden string Annahme, object, char[] usw. auf der Annahme, dass ein oder mehr von diesen war, was ConsoleAppender über Console anrief.

Dies war erfolgreich, und log4net-Protokollierung erscheint nun in meinem "Debug" -Fenster.

Ich schließe den folgenden Code für alle mit ähnlichen Zielen ein. (Um völlig sicher zu sein, könnte man die restlichen Methoden StringWriter.Write und .WriteLine außer Kraft setzen.) Ich habe die Aufrufe zu base entfernt, weil sie unnötig erscheinen, und ich denke, sie erstellen nur einen großen Puffer innerhalb StringWriter (in der Regel über diese Klasse zugegriffen) .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); 
     } 
    } 
}