我需要调用一个第三方库,这个库会向控制台输出大量内容。代码看起来像这样...
int MyMethod(int a)
{
int b = ThirdPartyLibrary.Transform(a); // spews unwanted console output
return b;
}
有没有一种简单的方法可以抑制ThirdPartyLibrary产生的不必要的控制台输出?出于性能原因,解决方案中不能使用新的进程或线程。
我需要调用一个第三方库,这个库会向控制台输出大量内容。代码看起来像这样...
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
编写器的引用,并使用它来进行自己的输出。
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... */
}
这将产生影响。在您使用 OutputSink
的过程中,任何试图从另一个线程使用控制台的应用程序逻辑都无法正确地写入标准输出、标准错误、控制台输出或控制台错误。
sprintf
和fprintf
命令的C++库代码。发出Console.SetOut(TextWriter.Null)
没有任何影响。@jon-skeet有什么想法吗? - Aaron Hudonsprintf
将格式化输出到内存中,而fprintf
则将其写入文件中... 两者都不会自动写入stdout。我建议您提出一个带有更多细节的新问题。 - Jon Skeetsprintf
的问题,我搞错了,实际上是fprintf( stdout ... )
还在被写入。我会写一个新的问题。 - Aaron Hudon