Aquí hay una manera de hacerlo (que también cubre generalmente de C++ aplicaciones que P/Invoke de C# o de otro tipo):
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);
}
}
Esta clase se puede llamar de la siguiente manera:
using (new OutputSink())
{
/* Call 3rd party library here... */
}
Esto tendrá un impacto. Cualquier lógica de aplicación que intente utilizar la consola desde otro subproceso durante el tiempo que esté using
OutputSink
no funcionará correctamente para escribir en la salida estándar, error estándar, salida de consola o error de consola.
Esto funciona en la mayoría de los casos. Sin embargo, en mi caso no es así. La biblioteca externa crea un objeto COM y al menos 1 hilo adicional, posiblemente incluso otro proceso, lo que complica mi problema. – noctonura
Ah. Hubiera sido bueno haber sabido que originalmente ... si está creando otros procesos o escribiendo la consola de formas distintas a usar 'Console.WriteLine' etc., eso hace las cosas mucho más difíciles ... –
Sí, lo siento, No me di cuenta de que eso era importante hasta que intentaste tu sugerencia. – noctonura