Перенаправить консоль в окно вывода отладочной информации Visual Studio в app.config
-
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, вероятно, является подходящим вариантом.