Supprimer la sortie de la console de bibliothèque tierce?
-
05-07-2019 - |
Question
Je dois appeler une bibliothèque tierce qui transfuse de nombreuses informations sur la console. Le code simplement comme ça ...
int MyMethod(int a)
{
int b = ThirdPartyLibrary.Transform(a); // spews unwanted console output
return b;
}
Existe-t-il un moyen simple de supprimer la sortie indésirable de la console de ThirdPartyLibrary? Pour des raisons de performances, les nouveaux processus ou threads ne peuvent pas être utilisés dans la solution.
La solution
Vous pouvez utiliser Console.SetOut
pour une implémentation de TextWriter
qui n'écrit nulle part:
Console.SetOut(TextWriter.Null);
Cela supprimera toutes la sortie de la console. Vous pouvez toujours conserver une référence au rédacteur original Console.Out
et l'utiliser pour votre propre sortie.
Autres conseils
Voici un moyen de le faire (qui couvre également les applications C ++ managées que vous appelez depuis / vers C # ou autre):
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);
}
}
Cette classe peut être appelée comme suit:
using (new OutputSink())
{
/* Call 3rd party library here... */
}
Cela aura un impact. Toute logique d'application qui tente d'utiliser la console à partir d'un autre thread pendant que vous utilisez
le OutputSink
ne fonctionnera pas correctement pour écrire dans la sortie standard, erreur standard, sortie de console , ou erreur de console.