Actualmente tengo una aplicación con una interfaz gráfica de usuario.

Sería posible utilizar esta misma aplicación desde la línea de comandos (sin interfaz gráfica de usuario y con el uso de parámetros).

O tengo que crear una por separado .exe (y aplicación) para la línea de comandos de la herramienta?

  • usted puede absolutamente el uso de la misma aplicación. Sólo añadir string[] args a su Principal método de
  • O, eche un vistazo a las respuestas a esta pregunta: stackoverflow.com/questions/1179532
  • Ya no estás preguntando acerca de la lectura de la entrada de la consola (sólo a partir de parámetros de línea de comandos), este es un duplicado.
  • Pitts: ok kewl. Pero ahora cuando hago: myapp.exe /t la interfaz gráfica de usuario está todavía abierto. La pregunta que se enlaza no llegar a este tema.
  • Que GUI framework estás usando? WinForms y WPF?
  • Morgan-Graham: WinForms
  • Es tan sencillo como no se ejecuta la línea de Application.Run(new MyMainForm());, entonces. Colóquelo en un if bloque, y si tienes argumentos, no ejecutar esa línea de código.
  • Morgan-Graham: omg es así de simple… Dulce! tnx

InformationsquelleAutor PeeHaa | 2011-08-26

6 Comentarios

  1. 58
    1. Editar las propiedades del proyecto para hacer que la aplicación de una «Aplicación para Windows» (no «Aplicación de Consola»). Usted todavía puede aceptar parámetros de línea de comandos de esta manera. Si usted no hace esto, entonces una ventana de la consola aparecerá cuando usted haga doble clic en el icono de la aplicación.
    2. Asegúrese de que su Main función acepta parámetros de línea de comandos.
    3. No mostrar la ventana si usted recibe cualquier parámetros de línea de comandos.

    He aquí un breve ejemplo:

    [STAThread]
    static void Main(string[] args)
    {
        if(args.Length == 0)
        {
            Application.Run(new MyMainForm());
        }
        else
        {
            //Do command line/silent logic here...
        }
    }

    Si su aplicación no está ya estructurado limpiamente hacer silencio procesamiento (si toda tu lógica está atascado en su WinForm código), puede hack silencio de procesamiento en el ala CharithJ la respuesta.

    EDICIÓN por OP
    Lo siento a apropiarse de su respuesta Merlyn. Sólo quiero toda la info aquí para los demás.

    A ser capaz de escribir en la consola en una aplicación WinForms solo haz lo siguiente:

    static class Program
    {
        //defines for commandline output
        [DllImport("kernel32.dll")]
        static extern bool AttachConsole(int dwProcessId);
        private const int ATTACH_PARENT_PROCESS = -1;
    
        ///<summary>
        ///The main entry point for the application.
        ///</summary>
        [STAThread]
        static void Main(string[] args)
        {
            //redirect console output to parent process;
            //must be before any calls to Console.WriteLine()
            AttachConsole(ATTACH_PARENT_PROCESS);
    
            if (args.Length > 0)
            {
                Console.WriteLine("Yay! I have just created a commandline tool.");
                //sending the enter key is not really needed, but otherwise the user thinks the app is still running by looking at the commandline. The enter key takes care of displaying the prompt again.
                System.Windows.Forms.SendKeys.SendWait("{ENTER}");
                Application.Exit();
            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new QrCodeSampleApp());
            }
        }
    }
    • if all your logic is jammed into your WinForm code. Es 😛 Es una buena cosa, ya que soy un completo novato, y porque ‘me muerde en el culo’ ahora me voy a acordar de él para futuros proyectos. Creo que tengo algo de limpieza.
    • la última pregunta antes de irme a dormir: voy a ser capaz de escribir un mensaje a la línea de comandos, por ejemplo, cuando el programa ha terminado de ejecutar? O es una aplicación separada que se puede escribir en la línea de comandos o no escribir en línea de comandos?
    • Me parece que no puede conseguir que funcione, pero intente buscar en google: «AttachConsole de la Consola.WriteLine» o «AllocConsole de la Consola.WriteLine». Me gustaría sugerir el uso de una biblioteca de registro en su lugar, a pesar de que, tal como: netcommon.sourceforge.net (emparejado con NLog).
    • Tho incluso con la solución de registro, es posible que desee hacer la salida de la consola al actuar como una aplicación de consola. En ese caso, pruebe a aquellos AllocConsole/FreeConsole y AttachConsole opciones que he mencionado.
    • actualiza tu respuesta. Espero no te importa 🙂
    • No nos importa en absoluto. Tenga en cuenta que Console.WriteLine que va a ir poco-cubeta con esta solución si se hace doble clic en la aplicación. También, usted puede comprobar Marshal.GetLastWin32Error si cuidado cuando conecte fallado.
    • Alguna idea sobre cómo hacer que la Aplicación de Consola de salida sin necesidad de pulsar la tecla Enter? He intentado llamar FreeConsole() antes de mi Entorno.Exit(0) llamada a la función, pero sin suerte.
    • No lo ejecute en el depurador y usted no tendrá que pulsar enter. Trate de hacer doble clic en el archivo EXE sí mismo en explorer y ver si usted todavía tiene que.
    • Yo estaba corriendo desde el cmd.exe… ejecutar manualmente desde la línea de comandos. Si ejecuta como una aplicación GUI, entonces no, no tengo ningún problema. Me preocupa que si ejecuta como una tarea programada en el proceso de dejar de fumar.
    • Gracias, funciona bastante bien, sin embargo parece que para mí se está ejecutando en un hilo separado (por ejemplo, el símbolo del sistema devuelve inmediatamente sin esperar a que el proceso que comenzó en el Principal para completar. Es lo que esperaba?
    • ‘el uso del Sistema.En tiempo de ejecución.InteropServices;’ que se necesita para ser capaz de utilizar ‘DllImport’.
    • El inconveniente con AttachConsole es que el cmd llamada devolverá inmediatamente antes de que la consola está aún conectado y por lo tanto antes de la salida está escrito. Esta es también la razón por qué usted necesita un adicional de introducir la llave en la final. Si desea canalizar o redirigir la salida a algún lugar, sólo obtendrá un vacío de salida. No he encontrado una solución real a este punto. La solución dada no es aplicable para mí, pero es la más cercana.
    • Así que estoy tratando de hacer precisamente esto, pero lo que estoy experimentando es cuando ejecuto mi aplicación desde un símbolo del sistema con argumentos de línea de comandos que se ejecuta como debe ser, sin embargo, devuelve el control a la línea de comandos de inmediato. Estoy esperando a correr hasta el final y devuelve un código de salida. Estoy usando el medio Ambiente.Exit(-1) para los errores y (0) para el éxito, pero con el que regresa de inmediato que no va a funcionar correctamente.
    • ¿Alguna vez encontrar una buena solución para este problema? Estoy en el mismo barco.

  2. 10

    En su programa.cs de la clase mantener el Principal método de como es, pero agregar string[] Args el formulario principal. Por ejemplo…

        [STAThread]
        static void Main(string[] Args)
        {
            ....
            Application.Run(new mainform(Args));
        }

    En mainform.cs constructor

        public mainform(string[] Args)
        {
            InitializeComponent();
    
            if (Args.Length > 0)
             {
                 //Do what you want to do as command line application.
                 //You can hide the form and do processing silently.
                 //Remember to close the form after processing.
             }
        }
    • la mejor manera de hacerlo
    • +1, Pero no te molestes en hacer Application.Run si ejecuta como una aplicación de consola. Ocultación de la ventana de trabajo, pero es un hack 🙂
    • El inconveniente es que usted no será capaz de ver la salida en la ventana de la consola ya que no hay verdadera ventana de la consola se adjunta a la solicitud. Console.WriteLine no producirá resultados visibles.
  3. 0

    No suficientes puntos para comentar. Quería añadir a la aceptación de la solución que el [DllImport(«kernel32.dll»)] no es necesario escribir en la consola cuando se usa mingw para llamar al programa, parece que este es un windows/dos problema.

  4. 0

    Soy nuevo en programación de c#. Pero yo improvisaba las sugerencias para el código de OP y Merlyn. El problema que enfrentamos cuando el uso de su código sugerencia fue que el argumento de longitud es diferente cuando me llaman app.exe haciendo doble clic en app.exe o cuando me llaman desde CMD. Cuando app.exe se ejecuta como CLI desde CMD, a continuación, app.exe sí se convierte en el primer argumento. A continuación es mi improvisado código que funciona satisfactoria tanto como interfaz gráfica de usuario haga doble clic de app.exe y como CLI de CMD.

    [STAThread]
        static void Main(/*string[] args*/)
        {
            string[] args = Environment.GetCommandLineArgs();
            Console.WriteLine(args.Length);
            if (args.Length <= 1)
            {
                //calling gui part
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new ACVSAppForm());
            }
            else
            {
                //calling cli part                
                string opt = args[1];
                //Console.WriteLine(args[0]);                
                if(opt == "LastBuild")
                {
                    if(args.Length == 3)
                    {
                        var defSettings = Properties.Settings.Default;
                        defSettings.CIBuildHistPath = args[2];
                    }
                    else
                    {
                        //
                    }
                    CIBuildParser cibuildlst = new CIBuildParser();
                    cibuildlst.XMLParser();
                }
            }
    
        }

    Espero que esto ayude a alguien. El único inconveniente de que mi solución es cuando el app.exe se ejecuta como interfaz gráfica de usuario, se abre un CMD como salida de la consola de la ventana. Pero esto está bien para mi trabajo.

  5. -2

    Usted puede necesitar a la estructura de la Aplicación como una Aplicación de Consola, identificar lo que haces en «Acciones» – como hacer clic en el botón – en clase separada, que incluyen un formulario que puede ser demostrado si no hay argumentos de línea de comandos proporcionados, y manejar eventos de enrutamiento a los métodos comunes en su «Acción» de la clase.

    • No hacer una aplicación de consola. De lo contrario, una consola aparecerá cuando se inicia como una interfaz gráfica de usuario.
  6. -3

    Creo que es posible, que acaba de establecer su subsistema de «consola», verá una ventana de la consola así como la interfaz gráfica de usuario de la ventana.

    Pero para aceptar comandos de la ventana de la consola, supongo que usted tendrá que crear un hilo para hacerlo.

    • Esta no es una buena opción porque va a generar una consola adicional si ejecutarlo haciendo doble clic en el icono del archivo. También, usted no necesariamente tiene que generar otro hilo – por ejemplo, si usted se pasa de la «comandos» a través de parámetros de línea de comandos.

Dejar respuesta

Please enter your comment!
Please enter your name here