visual studio publicar proyecto pasar instalar form consola como aplicacion aparece c# winforms console

c# - pasar - publicar proyecto visual studio 2017



AplicaciĆ³n.NET que se ejecuta como Windows Form o como aplicaciĆ³n de consola (5)

Estoy buscando que una de mis aplicaciones de Windows Forms se ejecute mediante programación, desde la línea de comandos. En preparación, he separado la lógica en su propia clase de la Forma. Ahora estoy atascado tratando de hacer que la aplicación cambie de un lado a otro en función de la presencia de argumentos de línea de comando.

Aquí está el código para la clase principal:

static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { string[] args = Environment.GetCommandLineArgs(); if (args.Length > 1) // gets passed its path, by default { CommandLineWork(args); return; } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } private static void CommandLineWork(string[] args) { Console.WriteLine("It works!"); Console.ReadLine(); }

donde Form1 es mi forma y It works! string es solo un marcador de posición para la lógica real.

En este momento, al ejecutar esto desde Visual Studio (con argumentos de línea de comandos), la frase It works! se imprime en la Salida. Sin embargo, al ejecutar el archivo /bin/Debug/Program.exe (o / Release para ese asunto), la aplicación se bloquea.

¿Voy por esto de la manera correcta? ¿Tendría más sentido (es decir, tomar menos tiempo de desarrollo) que mi clase lógica sea una DLL que se cargue por dos aplicaciones separadas? ¿O hay algo completamente diferente de lo que no estoy enterado?

¡Gracias por adelantado!


¿Realmente va a ejecutarlo como una aplicación de consola real al pedirle al usuario que ingrese datos, etc., o simplemente va a iniciarlo con algunos argumentos para que pueda ejecutarse desde un archivo por lotes o una tarea programada o similar?

Si se trata de una aplicación de consola real, estoy de acuerdo con Foxfire en que probablemente valga la pena tener 2 archivos exe, pero de lo contrario lo mantendría como un solo exe. He hecho muchos de esos sin ningún problema.

¿Cuál es la excepción exacta que está ocurriendo?


Necesitará P / Invocar AllocConsole () si detecta un argumento de línea de comando. Verifique mi respuesta en este hilo para obtener el código requerido. La muestra de AC # está más abajo en la página. Se repitió aquí porque no confío en ese sitio del foro horrible:

using System; using System.Windows.Forms; namespace WindowsApplication1 { static class Program { [STAThread] static void Main(string[] args) { if (args.Length > 0) { // Command line given, display console AllocConsole(); ConsoleMain(args); } else { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } private static void ConsoleMain(string[] args) { Console.WriteLine("Command line = {0}", Environment.CommandLine); for (int ix = 0; ix < args.Length; ++ix) Console.WriteLine("Argument{0} = {1}", ix + 1, args[ix]); Console.ReadLine(); } [System.Runtime.InteropServices.DllImport("kernel32.dll")] private static extern bool AllocConsole(); } }


No estoy seguro de si hace la diferencia, pero en lugar de

static void Main() { string[] args = Environment.GetCommandLineArgs();

puedes poner en su lugar

static void Main(string[] args) {


Sí, sería mejor crear dos frontend .exes (uno para la línea de comando y otro para las ventanas).

La razón principal es que debe especificar el tipo de salida para su proyecto (línea de comando o aplicación de Windows y no puede seleccionar ambos).

Por lo tanto, siempre debe usar el tipo de salida de la aplicación de Windows (que viene a ser una sobrecarga para el sistema de mensajería de Windows y no le da una línea de comando "real").


Ir a las propiedades del proyecto

En la pestaña Aplicación , debería ver una lista desplegable llamada Tipo de salida . Cambiar esto a la aplicación de consola .

Allí, tienes una ventana y una consola. Ahora su código con el argumento del comando debería funcionar.