Question

Je dois appeler une bibliothèque tierce qui transfuse de nombreuses informations sur la console. Le code simplement comme ça ...

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

Existe-t-il un moyen simple de supprimer la sortie indésirable de la console de ThirdPartyLibrary? Pour des raisons de performances, les nouveaux processus ou threads ne peuvent pas être utilisés dans la solution.

Était-ce utile?

La solution

Vous pouvez utiliser Console.SetOut pour une implémentation de TextWriter qui n'écrit nulle part:

Console.SetOut(TextWriter.Null);

Cela supprimera toutes la sortie de la console. Vous pouvez toujours conserver une référence au rédacteur original Console.Out et l'utiliser pour votre propre sortie.

Autres conseils

Voici un moyen de le faire (qui couvre également les applications C ++ managées que vous appelez depuis / vers C # ou autre):

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);
    }
}

Cette classe peut être appelée comme suit:

using (new OutputSink())
{
    /* Call 3rd party library here... */
}

Cela aura un impact. Toute logique d'application qui tente d'utiliser la console à partir d'un autre thread pendant que vous utilisez le OutputSink ne fonctionnera pas correctement pour écrire dans la sortie standard, erreur standard, sortie de console , ou erreur de console.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top