17

我需要调用一个恰好向控制台喷出一堆东西的第 3 方库。代码就像这样......

int MyMethod(int a)
{
   int b = ThirdPartyLibrary.Transform(a);  // spews unwanted console output
   return b;
}

有没有一种简单的方法来抑制来自第三方库的不需要的控制台输出?出于性能原因,不能在解决方案中使用新进程或线程。

4

2 回答 2

19

那么你可以使用Console.SetOut一个TextWriter不写任何地方的实现:

Console.SetOut(TextWriter.Null);

不过,这将抑制所有控制台输出。您始终可以保留对原始 Console.Out作者的引用并将其用于您自己的输出。

于 2009-09-11T17:36:35.037 回答
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);
    }
}

这个类可以这样调用:

using (new OutputSink())
{
    /* Call 3rd party library here... */
}

这会产生影响。任何尝试在您所在的时间从另一个线程使用控制台的应用程序逻辑都usingOutputSink无法正常运行以写入标准输出、标准错误、控制台输出或控制台错误。

于 2017-03-16T18:12:29.560 回答