Pregunta

Necesito llamar a una biblioteca de terceros que puede arrojar un montón de cosas a la consola. El código simplemente como este ...

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

¿Existe una manera fácil de suprimir la salida de consola no deseada de ThirdPartyLibrary? Por motivos de rendimiento, no se pueden utilizar nuevos procesos o subprocesos en la solución.

¿Fue útil?

Solución

Bueno, puedes usar Console.SetOut para una implementación de TextWriter que no escribe en ninguna parte:

Console.SetOut(TextWriter.Null);

Eso suprimirá todos los resultados de la consola. Siempre puede mantener una referencia al escritor original Console.Out y usarlo para su propia salida.

Otros consejos

Esta es una forma de hacerlo (que generalmente también cubre las aplicaciones de C ++ administradas que P / Invoke desde C # o de otra manera):

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 clase se puede llamar de la siguiente manera:

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

Esto tendrá un impacto. Cualquier lógica de aplicación que intente usar la consola desde otro subproceso durante el tiempo en que esté utilizando el OutputSink no funcionará correctamente para escribir en la salida estándar, error estándar, salida de consola , o error de consola.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top