Aplicación C # tanto GUI como línea de comando

Actualmente tengo una aplicación con una GUI.

¿Sería posible usar esta misma aplicación desde la línea de comandos (sin GUI y con el uso de parámetros)?

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

  1. Edite las propiedades de su proyecto para hacer que su aplicación sea una “Aplicación de Windows” (no una “Aplicación de consola”). Todavía puede aceptar parámetros de línea de comandos de esta manera. Si no lo hace, aparecerá una ventana de consola cuando haga doble clic en el ícono de la aplicación.
  2. Asegúrese de que su función Main acepte los parámetros de línea de comandos.
  3. No muestre la ventana si obtiene algún parámetro de línea de comando.

Aquí hay un pequeño 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 aún no está estructurada para hacer un procesamiento silencioso (si toda su lógica está atrapada en su código WinForm), puede hackear el procesamiento silencioso con la respuesta de ala CharithJ .

EDITAR por OP. Perdón por secuestrar tu respuesta Merlyn. Solo quiero toda la información aquí para otros.

Para poder escribir en la consola en una aplicación de WinForms, haga 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; ///  /// The main entry point for the application. ///  [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()); } } } 

En su clase program.cs mantenga el método Main como está, pero agregue string[] Args al 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. } } 

No hay suficientes puntos para comentar. Quería agregar a la solución aceptada que el [DllImport (“kernel32.dll”)] no es necesario para escribir en la consola cuando se usa mingw para llamar al progtwig, parece que se trata de un problema de Windows / DOS.

Puede necesitar estructurar su Aplicación como una Aplicación de consola, identificar lo que hace en “Acciones” – como hacer clic en el botón – en una clase separada, incluir un formulario que se puede mostrar si no se suministraron argumentos de línea de comando y manejar eventos guiándolos a los métodos comunes en su clase “Acción”.

Creo que es posible, simplemente configure su subsistema como “consola”, verá una ventana de la consola y la ventana de la GUI.

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