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.
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
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 ... –
Ja - tut mir leid, Ich wusste nicht, dass das wichtig war, bis du deinen Vorschlag ausprobiert hast. – noctonura