抑制第三方库控制台输出?

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编写器的引用,并将其用于您自己的输出.

  • 啊。如果最初知道这一点就好了……如果它创建其他进程或以除使用“Console.WriteLine”等以外的方式编写控制台,这确实会让事情变得更加困难…… (2认同)
  • @AaronHudon:好吧,`sprintf` 格式化到内存中,而 `fprintf` 写入文件......它们都不会自动写入标准输出。我建议您提出一个包含更多详细信息的新问题。 (2认同)

Ale*_*dru 7

这是一种方法(通常也涵盖您从 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)

这会产生影响。任何应用程序逻辑,试图在你的时间使用控制台从另一个线程usingOutputSink功能将无法正确写入到标准输出,标准错误,控制台输出,或控制台错误。