Hi,
I didn't know whether this is the correct site for help from the IP community but here goes.

I have a DLL written in C# that opens a Console window inside a Windows app. I am utilizing this for use with IronPython when creating a Windows app as a standalone that needs the Console window along with the other windows.

It works fine doing for eg, Console.WriteLine() but output from the IP print method is not displayed.

How can I tell IP to send output from 'print' to the Console? I'm sure the answer is simple but I'm out of ideas.

Thanks for any help given.

PS I've attached the .cs file if anyone's interested in how it's done (NB. I didn't create the code)
using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Security;

namespace MyConsole
{
        /// <summary>
        /// Do ConsoleManager.Show() followed by Console.WritLine(), etc
        /// </summary>
        [SuppressUnmanagedCodeSecurity]
        public static class ConsoleManager
        {
                private const string Kernel32_DllName = "kernel32.dll";

                [DllImport(Kernel32_DllName)]
                private static extern bool AllocConsole();

                [DllImport(Kernel32_DllName)]
                private static extern bool FreeConsole();

                [DllImport(Kernel32_DllName)]
                private static extern IntPtr GetConsoleWindow();

                [DllImport(Kernel32_DllName)]
                private static extern int GetConsoleOutputCP();

                public static bool HasConsole
                {
                        get { return GetConsoleWindow() != IntPtr.Zero; }
                }

                /// <summary>
                /// Creates a new console instance if the process is not 
attached to a console already.
                /// </summary>
                public static void Show()
                {
                        //#if DEBUG
                        if (!HasConsole)
                        {
                                AllocConsole();
                                InvalidateOutAndError();
                        }
                        //#endif
                }

                /// <summary>
                /// 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.
                /// </summary>
                public static void Hide()
                {
                        //#if DEBUG
                        if (HasConsole)
                        {
                                SetOutAndErrorNull();
                                FreeConsole();
                        }
                        //#endif
                }

                public static void Toggle()
                {
                        if (HasConsole)
                        {
                                Hide();
                        }
                        else
                        {
                                Show();
                        }
                }

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

                        Debug.Assert(_out != null);
                        Debug.Assert(_error != null);

                        Debug.Assert(_InitializeStdOutError != null);

                        _out.SetValue(null, null);
                        _error.SetValue(null, null);

                        _InitializeStdOutError.Invoke(null, new object[] { true 
});
                }

                private static void SetOutAndErrorNull()
                {
                        Console.SetOut(TextWriter.Null);
                        Console.SetError(TextWriter.Null);
                }
        }
}
_______________________________________________
Ironpython-users mailing list
Ironpython-users@python.org
https://mail.python.org/mailman/listinfo/ironpython-users

Reply via email to