Подтвердить что ты не робот

Где Console.WriteLine входит в Debug?

Я нашел этот вопрос, но то, что я хочу знать, отличается - выводится ли выход из Console.WriteLine в любом месте при отладке? Я знаю, что для перехода к выходному окну мне следовало бы использовать Debug.WriteLine() или другие методы, но где идет стандартный Console.WriteLine()?

Edit При отладке вы не видите черный оконный экран/тестовый журнал - так что реальный вопрос, как я могу получить доступ/просмотреть этот вывод во время отладки?

4b9b3361

Ответ 1

Консоль может перенаправить ее на любой текстовый редактор. Если вы реализуете текстовый редактор, который записывает в Diagnostics.Debug, вы все настроены.

Здесь текстовый редактор, который записывает в отладчик.

using System.Diagnostics;
using System.IO;
using System.Text;

namespace TestConsole
{
    public class DebugTextWriter : TextWriter
    {
        public override Encoding Encoding
        {
            get { return Encoding.UTF8; }
        }

        //Required
        public override void Write(char value)
        {
            Debug.Write(value);
        }

        //Added for efficiency
        public override void Write(string value)
        {
            Debug.Write(value);
        }

        //Added for efficiency
        public override void WriteLine(string value)
        {
            Debug.WriteLine(value);
        }
    }
}

Поскольку он использует Diagnostics.Debug, он будет придерживаться ваших настроек компилятора, чтобы он мог написать любой вывод или нет. Этот вывод также можно увидеть в Sysinternals DebugView.

Вот как вы его используете:

using System;

namespace TestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.SetOut(new DebugTextWriter());
            Console.WriteLine("This text goes to the Visual Studio output window.");
        }
    }
}

Если вы хотите видеть вывод в Sysinternals DebugView при компиляции в режиме выпуска, вы можете использовать TextWriter, который записывает в API OutputDebugString. Это может выглядеть так:

using System.IO;
using System.Runtime.InteropServices;
using System.Text;

namespace TestConsole
{
    public class OutputDebugStringTextWriter : TextWriter
    {
        [DllImport("kernel32.dll")]
        static extern void OutputDebugString(string lpOutputString);

        public override Encoding Encoding
        {
            get { return Encoding.UTF8; }
        }

        //Required
        public override void Write(char value)
        {
            OutputDebugString(value.ToString());
        }

        //Added for efficiency
        public override void Write(string value)
        {
            OutputDebugString(value);
        }

        //Added for efficiency
        public override void WriteLine(string value)
        {
            OutputDebugString(value);
        }
    }
}

Ответ 2

NullStream, который определяется как "Поток без хранилища резервных копий". Все методы ничего не делают или ничего не возвращают. Это внутренний класс Stream. Следующий код берется из исходного кода Microsoft.

В принципе, когда один из методов записи Console вызывается в первый раз, выполняется вызов функции Windows API GetStdHandle для "стандартного вывода". Если дескриптор не возвращен, создается и используется NullStream.

Ответ Самуэля правильный и содержит общую информацию. Чтобы на самом деле перенаправить вывод консоли, независимо от типа проекта, используйте Console.SetOut(New System.IO.StreamWriter("C:\ConsoleOutput.txt")), что является простым примером.

Консоль управления, отладка и трассировка в файл

Чтобы ответить на ваш вопрос напрямую. Используйте ConsoleTraceListener и StreamWriter, чтобы направлять все три выхода в файл. Я использую следующее только для разработки.

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

Ответ 3

Отладка и выпуск не контролируют, появится ли консольное окно. Это контролируется типом вывода проекта. (Свойства → Приложение → Тип вывода). Консольное приложение предоставит вам консольное окно, которое будет визуализировать и получать входные данные из окна в потоки Error, In и Out в System.Console.

Класс System.Console предоставляет несколько свойств и методов для взаимодействия с потоками, даже если вы не можете их увидеть. В первую очередь: Error, In, Out, SetError(), SetIn(), SetOut() и методы чтения и записи.

Ответ 4

Он переходит на консоль (стандартный вывод) или в поток, установленный на консоль.

Ответ 5

Я на самом деле буду второй Джеймс на этом.

http://www.csharp411.com/console-output-from-winforms-application

описывает это в подробных подробностях (если перенаправить вывод в файл достаточно, хотя тогда вы можете легко использовать метод amissico). Большинство методов, которые они описывают, имитируют те, которые описаны в http://dslweb.nwnexus.com/~ast/dload/guicon.htm

Изменение проекта на "консольный" проект будет иметь аналогичный эффект, как уже упоминалось. Ура!

Ответ 6

Visual Studio запускает программы Windows (/target:winexe) с stdin/stdout/stderr, перенаправленным в Named Pipes. Другой конец каждой трубы принадлежит отладчику VS, и все, что читается на stderr/stdout, отображается в окне вывода отладки. Следовательно, Console.Write автоматически-магически появляется на выходе VS Debug. Обратите внимание, что это не происходит, если вы присоединяетесь к уже запущенному процессу (так как трюк перенаправления можно выполнить только во время запуска процесса).

При запуске консольных программ (/target:exe) это перенаправление не происходит, поэтому Console.Write переходит на фактическую консоль (или где бы stdout перенаправляется).

Я не мог найти ничего, что документирует это поведение, просто мой вывод о том, как VS запускает и отлаживает приложения.

Ответ 7

Даже в приложении WinForms вы можете создать консольное окно, но вам придется пройти через P/Invoke, чтобы напрямую вызвать метод Win32. См. http://pinvoke.net/default.aspx/kernel32/AllocConsole.html

Ответ 8

Console.writeline() переходит в окно консоли: запрос команды black/dos.