Comportamiento en la aplicación WinForm / Console Hybrid

Tengo un proyecto de WinForm que quiero que sea utilizable como una aplicación de consola si se le pasan ciertos argumentos. Usando algunos consejos que leí desde aquí, usé el siguiente código para hacer que esto funcione.

[System.Runtime.InteropServices.DllImport("kernel32.dll")] private static extern bool AllocConsole(); [System.Runtime.InteropServices.DllImport("kernel32.dll")] private static extern bool AttachConsole(int pid); ... if (!AttachConsole(-1)) { AllocConsole(); } 

Esto funciona, pero hay un efecto secundario molesto: toda la salida parece generarse a partir de un hilo de fondo. Cuando ejecuto el progtwig desde un indicador de comando, la salida muestra el siguiente aviso antes de mostrar la salida.

Establecí el Tipo de salida de las propiedades del proyecto en Aplicación de consola y solucioné este problema, pero ahora siempre aparece una ventana de consola, incluso cuando se ejecuta en ‘Modo WinForm’.

¿Hay alguna manera de obtener lo mejor de ambos mundos donde la consola se comporte como el progtwig es el proceso actual y la ventana de la consola no se muestra cuando el progtwig muestra el WinForm?

ACTUALIZACIÓN: Mis disculpas por no aclarar esto. Estoy alternando entre la consola y el modo WinForm en Program.cs como este:

 // nowin is a bool that is set based on a parameter if (nowin) { if (!AttachConsole(-1)) { AllocConsole(); } //... Console mode code here... } else { // run in window Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1(argDict)); } 

Tal vez lo he estado haciendo mal, pero siempre he hecho híbridos como este:

 [STAThread] public static int Main(string[] args) { if (args.Length > 0) { // run console code here } else { // start up the win form app Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } return 0; } 

En lugar de este método dudoso, puede lograr esto simplemente creando una aplicación winforms y no mostrando el formulario principal si se pasa un cierto argumento en la línea de comandos.

Como una aplicación de consola no necesita un bucle de mensajes, no se llama a Application.Run () cuando se llama en modo consola.

Así que tu principal () sería algo como:

  static void Main(params string[] args) { if (args.Length > 0 && args[0] == "consolemode") { // do stuff } else { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } } 

No he probado esto, pero creo que funcionaría.

Parece que no hay manera de evitarlo: 1) Si quiero que la salida en modo consola se comporte como una aplicación de consola dedicada, la ventana de la consola siempre debe estar allí. 2) Si quiero ocultar la consola cuando la ejecuto en modo de ventana, perderé las impresiones de locking.

Lo anterior funcionará, pero no le permitirá escribir en la consola, lo que está enloqueciendo si está intentando depurar excepciones. Para escribir en la consola desde una aplicación Win Forms, debe aplicar el código descrito aquí: http://www.codeissue.com/issues/i24e1ef8e5a93b4/run-windows-form-application-as-console-app-c .