Перенаправить консоль в окно вывода отладочной информации Visual Studio в app.config - PullRequest
11 голосов
/ 11 сентября 2009

Я хочу, чтобы мои Console.WriteLine() команды появлялись в моем окне «Вывод» с моими Debug.WriteLine() инструкциями. Я думаю, что я понял, как это сделать один раз, но я не могу вспомнить / найти в Google, как это сделать снова. Кажется, я помню, что смог сделать это в файле app.config.

Я нашел множество инструкций о том, как заставить операторы консоли и отладки появляться в выходных данных консоли, но не о том, как заставить их появляться в окне "Вывод".

Возможно ли это?

Ответы [ 3 ]

19 голосов
/ 18 октября 2009

В основном самое простое решение выглядит следующим образом.

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

И вы должны добавить эту строку в инициализацию программы:

Console.SetOut(new ToDebugWriter());
3 голосов
/ 15 сентября 2012

@ Ответ Аврама сработал для меня, за исключением того, что единственная перегрузка в его коде была не той, которую ConsoleAppender log4net использовал в моей системе. (Меня интересует Console.SetOut, чтобы log4net ConsoleAppender выводил на панель вывода Visual Studio "Debug".) Поэтому я переопределил все StringWriter * Write и WriteLine методы, принимающие string, object, char[] и т. Д. При условии, что один или несколько из них были тем, что ConsoleAppender вызывал через Console.

Это успешно выполнено, и запись в журнал log4net теперь отображается в моей панели «Отладка».

Я включил приведенный ниже код в пользу тех, кто преследует аналогичные цели. (Чтобы быть полностью безопасным, можно переопределить оставшиеся методы StringWriter.Write и .WriteLine.) Я удалил вызовы к base, потому что они кажутся ненужными, и я думаю, что они просто создают большой буфер внутри StringWriter (обычно доступ к этому классу .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);
        }
    }
}
1 голос
/ 11 сентября 2009

Если вы можете получить поток для окна вывода, вы можете использовать Console.SetOut () для перенаправления на него. Однако такой подход не представляется возможным.

System.Debug выводится на каждый TraceListener в его TraceListenerCollection . Первоначально зарегистрирован только один TraceListener, DefaultTraceListener . Он не использует объект потока и вместо этого использует нативные методы для вывода.

Подход, использующий API-интерфейс Visual Studio, - это, вероятно, правильный путь.

...