Domanda

Devo chiamare una libreria di terze parti che sembra spargere un sacco di cose sulla console. Il codice è semplicemente così ...

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

Esiste un modo semplice per eliminare l'output della console indesiderato da ThirdPartyLibrary? Per motivi di prestazioni, non è possibile utilizzare nuovi processi o thread nella soluzione.

È stato utile?

Soluzione

Bene, puoi usare Console.SetOut per un'implementazione di TextWriter che non scrive da nessuna parte:

Console.SetOut(TextWriter.Null);

Ciò eliminerà comunque tutto l'output della console. Puoi sempre mantenere un riferimento al originale Console.Out e usarlo per il tuo output.

Altri suggerimenti

Ecco un modo per farlo (che di solito copre anche le applicazioni C ++ gestite che tu P / Invoca da C # o in altro modo):

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);
    }
}

Questa classe può essere chiamata come segue:

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

Questo avrà un impatto. Qualsiasi logica dell'applicazione che tenta di utilizzare la console da un altro thread durante il periodo in cui si utilizza il OutputSink non funzionerà correttamente per scrivere nell'output standard, nell'errore standard, nell'output della console o errore della console.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top