サードパーティのライブラリコンソール出力を抑制しますか?
-
05-07-2019 - |
質問
コンソールに大量のものを吐き出すサードパーティのライブラリを呼び出す必要があります。コードはこのように単純に...
int MyMethod(int a)
{
int b = ThirdPartyLibrary.Transform(a); // spews unwanted console output
return b;
}
ThirdPartyLibraryからの不要なコンソール出力を抑制する簡単な方法はありますか?パフォーマンス上の理由から、新しいプロセスまたはスレッドをソリューションで使用することはできません。
解決
Console.SetOut
を使用して、どこにも書き込まない TextWriter
の実装に使用できます。
Console.SetOut(TextWriter.Null);
これは all コンソール出力を抑制します。常に original Console.Out
ライターへの参照を維持し、それを独自の出力に使用できます。
他のヒント
これを実行する1つの方法を次に示します(通常は、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... */
}
これは影響を及ぼします。 OutputSink
を使用
している間に別のスレッドからコンソールを使用しようとするアプリケーションロジックは、標準出力、標準エラー、コンソール出力に書き込むために正しく機能しません。 、またはコンソールエラー。
所属していません StackOverflow