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