Перенаправить консоль в окно вывода отладочной информации Visual Studio в app.config

StackOverflow https://stackoverflow.com/questions/1407974

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Console.SetOut(new ToDebugWriter());

Другие советы

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

Это успешно выполнено, и запись в журнал log4net теперь отображается в моем " Debug " панель.

Я включил приведенный ниже код в пользу тех, кто имеет аналогичные цели. (Для полной безопасности можно переопределить оставшиеся методы 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);
        }
    }
}

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

System.Debug выводится на каждый < a href = "http://msdn.microsoft.com/en-us/library/system.diagnostics.tracelistener.aspx" rel = "nofollow noreferrer"> TraceListener в его TraceListenerCollection . Первоначально зарегистрирован только один TraceListener, который является DefaultTraceListener . Он не использует объект потока и вместо этого использует собственные методы для вывода.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top