2011-08-26 12 views
42

Attualmente ho un'applicazione con una GUI.C# applicazione sia GUI che linea di comando

sarebbe possibile utilizzare questa stessa applicazione da linea di comando (senza interfaccia grafica e con l'utilizzo di parametri).

Oppure devo creare un exe separato (e applicazione) per lo strumento a riga di comando?

+0

si può assolutamente usare la stessa applicazione. Basta aggiungere 'string [] args' al metodo Main –

+0

Oppure, date un'occhiata alle risposte a questa domanda: http://stackoverflow.com/questions/1179532/ –

+0

Dal momento che non stai chiedendo di leggere l'input dalla console (solo dai parametri della riga di comando), questo è un dupe. –

risposta

55
  1. Modifica le proprietà del progetto per rendere la vostra applicazione di una "Applicazione Windows" (non "Console Application"). È ancora possibile accettare i parametri della riga di comando in questo modo. Se non lo fai, apparirà una finestra della console quando fai doppio clic sull'icona dell'app.
  2. Verificare che la funzione Main accetti i parametri della riga di comando.
  3. Non mostrare la finestra se si ottengono parametri della riga di comando.

Ecco un breve esempio:

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

Se l'applicazione non è già strutturato per fare l'elaborazione in modo pulito silenzioso (se tutta la vostra logica è inceppata nel codice WinForm), è possibile hack silent processing in ala CharithJ's answer.

MODIFICA da OP Mi dispiace per dirottare la risposta Merlyn. Voglio solo tutte le informazioni qui per gli altri.

Per essere in grado di scrivere a consolare in un'applicazione WinForms solo effettuare le seguenti operazioni:

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

'se tutta la tua logica è inceppata nel tuo codice WinForm'. È: P È comunque una buona cosa, dato che sono un principiante completo e perché mi "morde in culo" ora lo ricorderò per progetti futuri. Penso di avere un po 'di pulizia da fare. – PeeHaa

+0

ultima domanda prima di andare a dormire: sarò in grado di scrivere un messaggio sulla riga di comando quando ad esempio il programma è finito in esecuzione? O è un'app separata che può scrivere su riga di comando o non scrivere su riga di comando? – PeeHaa

+0

@PeeHaa: Non riesco a farlo funzionare, ma provo a cercare su google: "AttachConsole Console.WriteLine" * o * "AllocConsole Console.WriteLine". Suggerirei invece di utilizzare una libreria di registrazione, ad esempio: http://netcommon.sourceforge.net/ (accoppiato con NLog). –

-2

Penso che sia possibile, è sufficiente impostare il sottosistema di "console", si vedrà una finestra di console così come la finestra della GUI.

Ma per accettare comandi dalla finestra della console, credo che si dovrà creare un filo in più per farlo.

+0

Questa non è una buona opzione perché genererà una console aggiuntiva se la lanciano facendo doppio clic sull'icona del file. Inoltre, non è necessario generare un altro thread, ad esempio, se si passano i "comandi" tramite i parametri della riga di comando. –

-1

Potrebbe essere necessario strutturare l'applicazione come un'applicazione console, identificare ciò che si fa su "Azioni" - come fare clic sul pulsante - in una classe separata, includere un modulo che può essere mostrato se non sono stati forniti argomenti dalla riga di comando e gestisci gli eventi indirizzandoli ai metodi comuni nella tua classe "Action".

+1

Non renderlo un'app per console. Altrimenti apparirà una console quando la lanci come interfaccia grafica. –

9

Nella classe Program.cs mantenere il metodo principale in quanto è ma aggiungere string[] Args al form principale. Per esempio ...

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

In mainform.cs costruttore

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. 
     } 
    } 
+3

modo migliore per farlo – xbonez

+2

+1; Ma non preoccuparti nemmeno di fare 'Application.Run' se sei in esecuzione come app per console. Nascondere la finestra funzionerà, ma è un trucco :) –

+3

Lo svantaggio è che non sarà possibile vedere alcun output nella finestra della console poiché non c'è una vera finestra della console collegata all'applicazione. 'Console.WriteLine' non produrrà alcun output visibile. –

Problemi correlati