質問

コンソールに大量のものを吐き出すサードパーティのライブラリを呼び出す必要があります。コードはこのように単純に...

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 使用している間に別のスレッドからコンソールを使用しようとするアプリケーションロジックは、標準出力、標準エラー、コンソール出力に書き込むために正しく機能しません。 、またはコンソールエラー。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top