抑制第三方库控制台输出?
我需要调用一个第三方库来碰巧向控制台吐出一堆东西。 代码就像这样……
int MyMethod(int a) { int b = ThirdPartyLibrary.Transform(a); // spews unwanted console output return b; }
有没有一种简单的方法来抑制ThirdPartyLibrary中不需要的控制台输出? 出于性能原因,解决方案中不能使用新进程或线程。
那么你可以使用Console.SetOut
来实现TextWriter
,它不会在任何地方写入:
Console.SetOut(TextWriter.Null);
这将抑制所有控制台输出。 您始终可以维护对原始 Console.Out
的引用,并将其用于您自己的输出。
这是一种方法(通常还包括您从C#或其他方式调用的托管C ++应用程序):
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); } }
可以按如下方式调用此类:
using (new OutputSink()) { /* Call 3rd party library here... */ }
这会产生影响。 在您using
OutputSink
期间尝试从另一个线程使用控制台的任何应用程序逻辑都无法正确写入标准输出,标准错误,控制台输出或控制台错误。