Переадресация консоли на визуальное окно вывода отладки студии в app.config

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

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

Кто-нибудь знает?

Ответ 1

В основном самое простое решение выглядит так.

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

и вы должны добавить к инициализации программы эту строку "Console.SetOut(новый ToDebugWriter());

Ответ 2

@Ответ на Avram работал у меня, за исключением того, что единственная перегрузка в его коде была не той, которую log4net ConsoleAppender использовала в моей системе. (Меня интересует 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);
        }
    }
}

Ответ 3

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

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

Подход, который использует API Visual Studio, вероятно, подходит.