Sopprimere l'output della console della libreria di terze parti?
-
05-07-2019 - |
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.
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.