console de redirecionamento para Visual janela de saída de depuração Estúdio em app.config
-
05-07-2019 - |
Pergunta
Eu quero começar meus comandos Console.WriteLine()
a aparecer em minha janela "Output" com minhas declarações Debug.WriteLine()
. Eu acho que eu descobri como fazer isso uma vez, mas eu não me lembro / encontrar no google como fazê-lo novamente. Eu me lembro de ser capaz de fazer isso no arquivo app.config
.
I encontrar muitas instruções sobre como obter console e depuração declarações para aparecer na saída do console, mas não sabe como obtê-los para aparecer na janela "Output".
É possível?
Solução
Basicamente a maioria simples olhares solução como esta.
public class ToDebugWriter : StringWriter
{
public override void WriteLine(string value)
{
Debug.WriteLine(value);
base.WriteLine(value);
}
}
E você deve adicionar esta linha para a inicialização do programa:
Console.SetOut(new ToDebugWriter());
Outras dicas
@ de Avram resposta tem trabalhado para mim, exceto que a única sobrecarga em seu código não foi o que log4net de ConsoleAppender
estava usando no meu sistema. (Estou interessado em Console.SetOut
tão saídas ConsoleAppender
desse log4net para o painel de saída do Visual Studio "Debug".) Então eu cancelou todos os métodos StringWriter
e Write
de WriteLine
aceitar string
, object
, char[]
, etc. no pressuposto de que um ou mais destes foi o que ConsoleAppender
estava chamando via Console
.
Este conseguiu, e log4net log aparece agora no meu painel "Debug".
Estou incluindo o código abaixo para o benefício de qualquer pessoa com objetivos semelhantes. (Para ser totalmente seguro, pode-se substituir os restantes métodos StringWriter.Write
e .WriteLine
.) Eu removi as chamadas para base
porque eles parecem ser desnecessários, e eu acho que eles só construir um dentro StringWriter
grande buffer (normalmente acessado através dessa Classe .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);
}
}
}
Se você pode se apossar do fluxo para a janela de saída você pode usar Console.SetOut () para redirecionar para ele. No entanto, esta abordagem não parece ser possível.
System.Debug saídas a cada < a href = "http://msdn.microsoft.com/en-us/library/system.diagnostics.tracelistener.aspx" rel = "nofollow noreferrer"> TraceListener em sua TraceListenerCollection . Há apenas um TraceListener registrado inicialmente que é a DefaultTraceListener . Não faz uso de um objeto de fluxo e em vez disso usa métodos nativos para a saída.
Uma abordagem que usa a API do Visual Studio é provavelmente o caminho a percorrer.