Переадресация консоли на визуальное окно вывода отладки студии в 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, вероятно, подходит.