Unterdrückt 3rd-Party-Bibliothek Konsole ausgegeben?
-
05-07-2019 - |
Frage
Ich brauche eine 3rd-Party-Bibliothek aufrufen, die ein paar Sachen an die Konsole spucken geschieht. Der Code einfach so ...
int MyMethod(int a)
{
int b = ThirdPartyLibrary.Transform(a); // spews unwanted console output
return b;
}
Gibt es einen einfachen Weg, um die unerwünschte Konsolenausgabe von ThirdPartyLibrary zu unterdrücken? Aus Performance-Gründen neue Prozesse oder Threads nicht in der Lösung verwendet werden.
Lösung
Nun können Sie Console.SetOut
auf eine Implementierung von TextWriter
benutzen, die nicht überall schreiben:
Console.SetOut(TextWriter.Null);
Das wird unterdrücken alle Konsolenausgabe though. Sie können immer einen Verweis auf die Original Console.Out
Schriftsteller halten und verwenden, die für die eigene Ausgabe.
Andere Tipps
Hier ist eine Möglichkeit, es zu tun (welche auch in der Regel deckt verwaltete C ++ Anwendungen, die Sie P / Invoke von C # oder auf andere Weise):
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);
}
}
Diese Klasse kann wie folgt aufgerufen werden:
using (new OutputSink())
{
/* Call 3rd party library here... */
}
Dies wird Auswirkungen haben. Jede Anwendungslogik, die die Konsole von einem anderen Thread während der Zeit versucht, verwenden Sie die using
OutputSink
sind nicht richtig funktionieren auf die Standardausgabe, Standardfehler, Konsolenausgabe oder Konsole Fehler zu schreiben.