[Ironpython-users] How to direct print output to the Console in a windows standalone?

John Trinder trinderjohn at talktalk.net
Sun Nov 16 22:48:07 CET 2014


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


More information about the Ironpython-users mailing list