2009-09-11 6 views
12

Necesito llamar a una biblioteca de terceros que arroje un montón de cosas a la consola. El código simplemente como esto ...¿Suprime la salida de la consola de la biblioteca de terceros?

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

¿Hay una manera fácil de suprimir la salida de la consola no deseado de ThirdPartyLibrary? Por razones de rendimiento, los nuevos procesos o subprocesos no se pueden usar en la solución.

Respuesta

12

Bien puede utilizar Console.SetOut a una implementación de TextWriter que no escribir en cualquier lugar:

Console.SetOut(TextWriter.Null); 

que suprimirá toda salida de la consola sin embargo. Siempre puede mantener una referencia al originalConsole.Out escritor y usar eso para su propia salida.

+0

Esto funciona en la mayoría de los casos. Sin embargo, en mi caso no es así. La biblioteca externa crea un objeto COM y al menos 1 hilo adicional, posiblemente incluso otro proceso, lo que complica mi problema. – noctonura

+1

Ah. Hubiera sido bueno haber sabido que originalmente ... si está creando otros procesos o escribiendo la consola de formas distintas a usar 'Console.WriteLine' etc., eso hace las cosas mucho más difíciles ... –

+0

Sí, lo siento, No me di cuenta de que eso era importante hasta que intentaste tu sugerencia. – noctonura

0

Aquí hay una manera de hacerlo (que también cubre generalmente de C++ aplicaciones que P/Invoke de C# o de otro tipo):

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 utilizar la consola desde otro subproceso durante el tiempo que esté usingOutputSink no funcionará correctamente para escribir en la salida estándar, error estándar, salida de consola o error de consola.

Cuestiones relacionadas