2009-09-11 13 views
12

Ich muss eine 3rd-Party-Bibliothek aufrufen, die zufällig eine Menge Zeug auf die Konsole spuckt. Der Code einfach so ...Unterdrücken Sie die Ausgabe von Drittanbieter-Bibliothekskonsolen?

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

Gibt es einen einfachen Weg, um die unerwünschte Konsolenausgabe von ThirdPartyLibrary zu unterdrücken? Aus Gründen der Leistung können neue Prozesse oder Threads nicht in der Lösung verwendet werden.

Antwort

12

Nun können Sie mit Console.SetOut auf eine Implementierung von TextWriter, die nicht überall schreiben:

Console.SetOut(TextWriter.Null); 

dass, obwohl alle Konsolenausgabe unterdrücken. Sie könnten immer einen Verweis auf die OriginalConsole.Out Writer halten und das für Ihre eigene Ausgabe verwenden.

+0

Dies funktioniert in den meisten Fällen. In meinem Fall jedoch nicht. Die externe Bibliothek erstellt ein COM-Objekt und mindestens einen anderen Thread - möglicherweise sogar einen anderen Prozess, der mein Problem verkompliziert. – noctonura

+1

Ah. Es wäre schön gewesen, das ursprünglich zu wissen ... wenn es andere Prozesse erstellt oder die Konsole anders als mit 'Console.WriteLine' usw. schreibt, macht das die Sache viel schwieriger ... –

+0

Ja - tut mir leid, Ich wusste nicht, dass das wichtig war, bis du deinen Vorschlag ausprobiert hast. – noctonura

0

Hier ist eine Möglichkeit, es zu tun (was in der Regel auch C++ Anwendungen, die Sie P/Invoke von C# oder auf andere Weise verwaltet Abdeckungen):

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

Diese Klasse aufgerufen werden können wie folgt:

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

Dies wird Auswirkungen haben. Jede Anwendungslogik, die versucht, die Konsole aus einem anderen Thread während der Zeit using der OutputSink zu verwenden, funktioniert nicht ordnungsgemäß, um auf die Standardausgabe, Standardfehler, Konsolenausgabe oder Konsolenfehler zu schreiben.

Verwandte Themen