Подавить стороннюю библиотечную консоль?
Мне нужно вызвать библиотеку сторонних разработчиков, которая, случается, извергает кучу вещей на консоль. Код просто так...
int MyMethod(int a)
{
int b = ThirdPartyLibrary.Transform(a); // spews unwanted console output
return b;
}
Есть ли простой способ подавить нежелательный вывод консоли из ThirdPartyLibrary? По соображениям производительности новые процессы или потоки не могут использоваться в решении.
Ответы
Ответ 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)! Большое спасибо, что нашли время, чтобы представить это.