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

时间:2009-09-11 17:33:02

标签: c# .net console-application

我需要调用第三方库,它恰好会向控制台吐出一堆东西。代码就像这样......

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

是否有一种简单的方法可以抑制ThirdPartyLibrary中不需要的控制台输出?出于性能原因,解决方案中不能使用新进程或线程。

2 个答案:

答案 0 :(得分:15)

您可以将Console.SetOut用于TextWriter的实现,该实现不会在任何地方写入:

Console.SetOut(TextWriter.Null);

这会抑制所有控制台输出。您始终可以维护对原始 Console.Out编写器的引用,并将其用于您自己的输出。

答案 1 :(得分:3)

这是一种方法(通常还包括您从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... */
}

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