Suppress 3rd party library console output?

前端 未结 2 1162
余生分开走
余生分开走 2021-02-04 05:06

I need to call a 3rd party library that happens to spew a bunch of stuff to the console. The code simply like this...

int MyMethod(int a)
{
   int b = ThirdPart         


        
2条回答
  •  温柔的废话
    2021-02-04 05:36

    Here's one way to do it (which also usually covers managed C++ applications that you P/Invoke from C# or otherwise):

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

    This class can be called as follows:

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

    This will have an impact. Any application logic that tries to use the console from another thread during the time you are using the OutputSink will not function correctly to write to the standard output, standard error, console output, or console error.

提交回复
热议问题