using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security; using System.Runtime.InteropServices; using System.Diagnostics; using System.IO; namespace S7.Net.UnitTest.Helpers { [SuppressUnmanagedCodeSecurity] public static class ConsoleManager { public static bool HasConsole { get { return NativeMethods.GetConsoleWindow() != IntPtr.Zero; } } /// /// Creates a new console instance if the process is not attached to a console already. /// public static void Show() { //#if DEBUG if (!HasConsole) { NativeMethods.AllocConsole(); InvalidateOutAndError(); } //#endif } /// /// If the process has a console attached to it, it will be detached and no longer visible. Writing to the System.Console is still possible, but no output will be shown. /// public static void Hide() { //#if DEBUG if (HasConsole) { SetOutAndErrorNull(); NativeMethods.FreeConsole(); } //#endif } public static void Toggle() { if (HasConsole) { Hide(); } else { Show(); } } static void InvalidateOutAndError() { Type type = typeof(System.Console); System.Reflection.FieldInfo _out = type.GetField("_out", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); System.Reflection.FieldInfo _error = type.GetField("_error", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); System.Reflection.MethodInfo _InitializeStdOutError = type.GetMethod("InitializeStdOutError", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); System.Diagnostics.Debug.Assert(_out != null); System.Diagnostics.Debug.Assert(_error != null); System.Diagnostics.Debug.Assert(_InitializeStdOutError != null); _out.SetValue(null, null); _error.SetValue(null, null); _InitializeStdOutError.Invoke(null, new object[] { true }); } static void SetOutAndErrorNull() { Console.SetOut(TextWriter.Null); Console.SetError(TextWriter.Null); } } }