Where does Console.WriteLine go in Debug?

后端 未结 10 2125
后悔当初
后悔当初 2020-12-15 16:23

I found this question, but what I want to know is different - does the output from Console.WriteLine go anywhere when debugging? I know that for it to go to the output windo

10条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-15 17:16

    NullStream, which is defined as "A Stream with no backing store.". All the methods do nothing or return nothing. It is an internal class to Stream. The following code is taken from Microsoft's source code.

    Basically, when one of the Console write methods is call the first time, a call is made to the Windows API function GetStdHandle for "standard output". If no handle is returned a NullStream is created and used.

    Samuel's answer is correct and provides general information. To actually redirect Console output, regardless of the project type, use Console.SetOut(New System.IO.StreamWriter("C:\ConsoleOutput.txt")), which is a simple example.

    Directing Console, Debug, and Trace to File

    To answer your question directly. Use the ConsoleTraceListener and a StreamWriter to direct all three outputs to a file. I use the following for development only.

        Dim oLogFile As New System.IO.StreamWriter("C:\ConsoleOutput.txt")
        oLogFile.AutoFlush = True 'so we do not have to worry about flushing before application exit
    
        Console.SetOut(oLogFile)
    
        'note, writing to debug and trace causes output on console, so you will get double output in log file
        Dim oListener As New ConsoleTraceListener
        Debug.Listeners.Add(oListener)
        Trace.Listeners.Add(oListener)
    

    NullStream

    [Serializable]
    private sealed class NullStream : Stream {
        internal NullStream() { }
    
        public override bool CanRead {
            get { return true; }
        }
    
        public override bool CanWrite {
            get { return true; }
        }
    
        public override bool CanSeek {
            get { return true; }
        }
    
        public override long Length {
            get { return 0; }
        }
    
        public override long Position {
            get { return 0; }
            set { }
        }
    
        // No need to override Close
    
        public override void Flush() {
        }
    
        public override int Read([In, Out] byte[] buffer, int offset, int count) {
            return 0;
        }
    
        public override int ReadByte() {
            return -1;
        }
    
        public override void Write(byte[] buffer, int offset, int count) {
        }
    
        public override void WriteByte(byte value) {
        }
    
        public override long Seek(long offset, SeekOrigin origin) {
            return 0;
        }
    
        public override void SetLength(long length) {
        }
    } 
    

提交回复
热议问题