Pergunta

Eu preciso chamar uma biblioteca parte 3 que acontece a vomitar um monte de coisas para o console. O código simplesmente assim ...

int MyMethod(int a)
{
   int b = ThirdPartyLibrary.Transform(a);  // spews unwanted console output
   return b;
}

Existe uma maneira fácil para suprimir a saída do console indesejada de ThirdPartyLibrary? Por motivos de desempenho, novos processos ou threads não pode ser usado na solução.

Foi útil?

Solução

Bem, você pode usar Console.SetOut para uma implementação de TextWriter que não escrever em qualquer lugar:

Console.SetOut(TextWriter.Null);

que suprimem vontade todas saída do console embora. Você pode sempre manter uma referência para o ORIGINAL escritor Console.Out e uso que para a sua própria saída.

Outras dicas

Aqui está uma maneira de fazê-lo (que também normalmente cobre conseguiu aplicações C ++ que você P / Invoke de C # ou não):

internal class OutputSink : IDisposable
{
    [DllImport("kernel32.dll")]
    public static extern IntPtr GetStdHandle(int nStdHandle);

    [DllImport("kernel32.dll")]
    public static extern int SetStdHandle(int nStdHandle, IntPtr hHandle);

    private readonly TextWriter _oldOut;
    private readonly TextWriter _oldError;
    private readonly IntPtr _oldOutHandle;
    private readonly IntPtr _oldErrorHandle;

    public OutputSink()
    {
        _oldOutHandle = GetStdHandle(-11);
        _oldErrorHandle = GetStdHandle(-12);
        _oldOut = Console.Out;
        _oldError = Console.Error;
        Console.SetOut(TextWriter.Null);
        Console.SetError(TextWriter.Null);
        SetStdHandle(-11, IntPtr.Zero);
        SetStdHandle(-12, IntPtr.Zero);
    }

    public void Dispose()
    {
        SetStdHandle(-11, _oldOutHandle);
        SetStdHandle(-12, _oldErrorHandle);
        Console.SetOut(_oldOut);
        Console.SetError(_oldError);
    }
}

Esta classe pode ser chamado como segue:

using (new OutputSink())
{
    /* Call 3rd party library here... */
}

Isto terá um impacto. Qualquer lógica de aplicação que tenta usar o console de outro segmento durante o tempo que você está using o OutputSink não funcionará corretamente para escrever para a saída padrão, erro padrão, a saída do console, ou erro console.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top