2010-05-11 17 views
12

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.Aplicación .NET que se ejecuta como Windows Form o como aplicación de consola

Aquí es el código de 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 la cadena It works! es sólo 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 de antemano!

+0

¿Qué excepción recibe cuando se bloquea la aplicación? Además, supongo que debería ser args.Length> = 1 (o> 0) en lugar de> 1? –

Respuesta

22

Necesitará P/Invocar AllocConsole() si detecta un argumento de línea de comando. Verifique mi respuesta en this thread para obtener el código requerido. Una muestra de C# está más abajo en la página. Repite aquí porque no me fío de ese sitio de mala muerte foro:

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(); 
    } 
} 
+1

También puede usar 'FreeConsole': http://stackoverflow.com/questions/1786840/c-is-it-possible-to-have-a-single-application-behave-as-console-or-windows-appl/1787008 # 1787008 – adrianbanks

+1

¿Por qué no hacer solo una aplicación de consola en primer lugar y luego hacer referencia al ensamblaje de Formas para la creación de ventanas? –

+0

@Chris: obtenga una consola solo a pedido, no siempre. FreeConsole es un * desagradable * flash. –

1

Sí, sería mejor hacer dos fronex .exes (uno para la línea de comandos y otro para las ventanas).

La razón principal es que usted tiene que especificar el tipo de salida para su proyecto (ya sea línea de comandos o aplicación de Windows y no se puede seleccionar ambos.

Así que tendría que utilizar siempre el tipo de salida aplicación de Windows (que viene a una sobrecarga para el sistema de mensajería de Windows y no le da la línea de comandos "real").

1

no estoy seguro si se hace una diferencia, pero en lugar de

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

se puede poner en su lugar

static void Main(string[] args) 
{ 
+2

Como esto no es una solución al problema en cuestión, ¿debería ser un comentario, no una respuesta? – Peter

0

¿Está realmente va a funcionar como una aplicación de consola real con pedir al usuario que introduzca los datos, etc, o simplemente que va a ponerlo en marcha 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?

0

Ir a las propiedades del proyecto

En la ficha Aplicación debería ver una lista desplegable llamado Tipo salida. Cambie esto a la aplicación de consola .

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

Cuestiones relacionadas