我需要调用第三方库来碰巧向控制台吐出一堆东西。代码就像这样......

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... */
}

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top