Diferencia entre la consola y las aplicaciones winforms cuando se ejecuta desde cmd

Tengo una aplicación de winforms que a veces se usa desde la línea de comandos. Aquí está el código (simplificado por supuesto):

[STAThread] static void Main() { AttachConsole(ATTACH_PARENT_PROCESS); Console.WriteLine("Hello"); /*Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1());*/ } 

Si esa era una aplicación de consola, la salida podría ser:

 C:\ConsoleApplication\ConsoleApplication.exe Hello C:\ConsoleApplication\_ 

En caso de aplicación de Windows su realidad:

 C:\WindowsApplication\WindowsApplication.exe C:\WindowsApplication\Hello _ 

¿Alguien puede decirme por qué tenemos tanta diferencia y es posible que mi aplicación de Windows se comporte como una consola cuando se ejecuta desde cmd?

editar:

Quiero que mi aplicación de Windows se comporte como una consola cuando se ejecuta desde cmd:

 C:\WindowsApplication\WindowsApplication.exe Hello C:\WindowsApplication\_ 

solución:

Como resultado estoy ejecutando mi aplicación como

 C:\WindowsApplication\start /wait WindowsApplication.exe 

Sí. La diferencia es que cmd.exe es consciente del tipo de ejecutable. Se sabe que esperar a que finalice el proceso cuando se trata de una aplicación de modo de consola. No espera cuando se trata de una aplicación de gui de Windows normal. Confiando en que va a crear su propia ventana. Así que vuelve a mostrar el símbolo del sistema, su salida se añade a eso. También tendrá problemas para usar Console.ReadLine() cierto.

Tendría que iniciar su progtwig con start /wait yourapp.exe para forzar a cmd.exe a esperar. Llamar a AllocConsole() cambio es la única solución universal. También se encarga de crear la consola cuando su aplicación se inicia desde un acceso directo.

AllocConsole () es bastante desorientador. Considere escribir una aplicación de modo de consola pequeña que no haga nada más que Process.Start + WaitForExit para iniciar su progtwig principal. Tal vez también munging los argumentos de la línea de comandos. Ahora recuperas el comportamiento de locking. Si cambia el nombre del archivo ejecutable a mainapp.com (para iniciar mainapp.exe), la diferencia se oculta bastante bien, un truco que VS usa también (devenv.exe vs devenv.com).

Hay una bandera en el exe, que indica si se trata de una aplicación de consola o gui (winform en su caso). Cuando inicie una aplicación, Windows separará la consola del progtwig si es una aplicación de consola. Puede utilizar el siguiente enfoque para lograr lo que quiere:

  1. Comstack tu aplicación como gui, llámala mytool.exe
  2. Cree un alias de doskey mytool = start / wait c: \ path \ mytool.exe $ *

De esta manera, cuando inicia mytool.exe en el explorador o acceso directo, inicia una aplicación normal de Windows; cuando escribes mytool en la consola, en realidad lo inicias con “start / wait”, lo que no desvinculará la consola, por lo que se refiere menos a la bandera. (Sin embargo, debe adjuntar a la consola principal en su aplicación si desea generar / ingresar algo desde la consola).

Desea que la aplicación de Windows bloquee el subproceso de la Consola mientras se ejecute, si lo entiendo correctamente. No tengo idea de por qué haría eso, pero puedo darle una idea de cómo podría funcionar:

Cambie la aplicación WinForms a una aplicación de consola, que abre un formulario. De esta manera bloquearía el hilo de la consola mientras se muestra una ventana.