Подтвердить что ты не робот

Подавить стороннюю библиотечную консоль?

Мне нужно вызвать библиотеку сторонних разработчиков, которая, случается, извергает кучу вещей на консоль. Код просто так...

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

Есть ли простой способ подавить нежелательный вывод консоли из ThirdPartyLibrary? По соображениям производительности новые процессы или потоки не могут использоваться в решении.

4b9b3361

Ответ 1

Ну, вы можете использовать Console.SetOut для реализации TextWriter, который нигде не записывается:

Console.SetOut(TextWriter.Null);

Это будет подавлять все консольные выходы. Вы всегда можете поддерживать ссылку на оригинальную запись Console.Out и использовать ее для собственного вывода.

Ответ 2

Здесь один из способов сделать это (который также обычно охватывает управляемые приложения на С++, которые вы P/Invoke из С# или иначе):

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, не будет корректно работать для записи на стандартный вывод, стандартную ошибку, вывод консоли или консольную ошибку.

Ответ 3

Это работало безупречно для моего консольного приложения (VS2017 предназначался для 4.7.2 с использованием первоклассных библиотек PDF SautinSoft)! Большое спасибо, что нашли время, чтобы представить это.