Куда Console.WriteLine идет в Debug? - PullRequest
26 голосов
/ 30 октября 2008

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

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

Ответы [ 9 ]

19 голосов
/ 07 апреля 2011

Консоль может перенаправить вывод на любой текстовый редактор. Если вы внедрите текстовый редактор, который пишет в 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 при компиляции в режиме Release, вы можете использовать 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);
        }
    }
}
10 голосов
/ 16 января 2010

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

Обычно, когда один из методов записи Console вызывается в первый раз, вызывается функция Windows 100 * API для "стандартного вывода" Если дескриптор не возвращается, создается и используется 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 голосов
/ 30 октября 2008

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

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

2 голосов
/ 22 мая 2018

Лучшим решением для меня было изменить Console.WriteLine () на System.Diagnostics.Debug.WriteLine (). Например:

 catch (DbEntityValidationException dbEx)
 {
    foreach (var validationErrors in dbEx.EntityValidationErrors)
    {
       foreach (var validationError in validationErrors.ValidationErrors)
       {
          System.Diagnostics.Debug.WriteLine("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
       }
    }

Затем вы можете просмотреть свои ошибки как объект в окне вывода.

1 голос
/ 13 марта 2011

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

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

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

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

0 голосов
/ 15 ноября 2017

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

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

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

0 голосов
/ 30 октября 2008

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

0 голосов
/ 30 октября 2008

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

0 голосов
/ 30 октября 2008

Идет в консоль (стандартный вывод) или в поток, для которого установлена ​​консоль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...