2011-08-26 14 views
42

Obecnie mam aplikację z GUI.Aplikacja C# zarówno GUI, jak i linia poleceń

Czy można użyć tej samej aplikacji z wiersza poleceń (bez GUI i przy użyciu parametrów).

Czy muszę utworzyć osobny plik .exe (i aplikację) dla narzędzia wiersza poleceń?

+0

można absolutnie użyć tego samego wniosku. Po prostu dodaj 'string [] args' do swojej głównej metody –

+0

Albo, spójrz na odpowiedzi na to pytanie: http://stackoverflow.com/questions/1179532/ –

+0

Ponieważ nie pytasz o odczyt wejścia z konsoli (tylko z parametrów wiersza poleceń), jest to duplikat. –

Odpowiedz

55
  1. zmieniać swoich właściwości projektu, aby swoją aplikację "System Windows Application" (nie "Console Application"). W ten sposób możesz nadal akceptować parametry linii poleceń. Jeśli tego nie zrobisz, pojawi się okno konsoli po dwukrotnym kliknięciu ikony aplikacji.
  2. Upewnij się, że Twoja funkcja Main akceptuje parametry wiersza poleceń.
  3. Nie wyświetlaj okna, jeśli uzyskasz parametry wiersza polecenia.

Oto krótki przykład:

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

Jeśli aplikacja nie jest już tak skonstruowane, aby zrobić czysto milczy przetwarzanie (jeśli wszystko twoja logika jest zakleszczony w kodzie WinForm), można hack silent processing in ala CharithJ's answer.

EDYTUJ przez OP Przepraszam za przejęcie twojej odpowiedzi Merlyn. Po prostu chcę wszystkie informacje tutaj dla innych.

Aby móc napisać do konsoli w aplikacji WinForms prostu wykonaj następujące czynności:

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

'jeśli cała twoja logika jest zablokowana w twoim kodzie WinForm'. Jest: P To dobrze, ponieważ jestem kompletnym nowicjuszem, a ponieważ "ugryzie mnie w dupę", zapamiętam to dla przyszłych projektów. Myślę, że mam trochę do zrobienia. – PeeHaa

+0

ostatnie pytanie przed pójściem spać: czy będę mógł napisać wiadomość do linii poleceń, gdy na przykład program zostanie uruchomiony? Czy jest to osobna aplikacja, która może pisać do wiersza poleceń lub nie pisać do wiersza poleceń? – PeeHaa

+0

@PeeHaa: Nie mogę tego uruchomić, ale spróbuj google: "AttachConsole Console.WriteLine" * lub * "AllocConsole Console.WriteLine". Sugerowałbym jednak użycie biblioteki rejestrowania, takiej jak: http://netcommon.sourceforge.net/ (w połączeniu z NLog). –

-2

Myślę, że jest to możliwe, wystarczy ustawić podsystem na "konsolę", pojawi się okno konsoli oraz okno GUI.

Ale aby zaakceptować polecenia z okna konsoli, domyślam się, że trzeba będzie utworzyć dodatkowy wątek, aby to zrobić.

+0

Nie jest to dobra opcja, ponieważ uruchomi dodatkową konsolę, jeśli uruchomi ją, klikając dwukrotnie ikonę pliku. Ponadto, nie koniecznie musisz odradzać inny wątek - na przykład, jeśli przekazujesz swoje "polecenia" za pośrednictwem parametrów wiersza poleceń. –

-1

Może zajść potrzeba ukształtowania aplikacji jako aplikacji konsolowej, zidentyfikowania czynności wykonywanych w "działaniach" - takich jak kliknięcie przycisku - w oddzielnej klasie, dołączenie formularza, który można wyświetlić, jeśli nie podano argumentów wiersza poleceń i obsługiwać zdarzenia, kierując je do popularnych metod w klasie "Action".

+1

Nie należy tworzyć aplikacji konsolowej. W przeciwnym razie pojawi się konsola po uruchomieniu go jako GUI. –

9

W swojej klasie program.cs zachowaj główną metodę, ale dodaj do głównego formularza formularz string[] Args. Na przykład ...

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

W mainform.cs konstruktora

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

najlepszy sposób na zrobienie tego – xbonez

+2

+1; Ale nawet nie przejmuj się 'Application.Run', jeśli używasz aplikacji konsolowej. Ukrywanie okna będzie działało, ale to jest hack :) –

+3

Wadą jest to, że nie będzie widać żadnego wyjścia w oknie konsoli, ponieważ nie ma rzeczywistego okna konsoli dołączonego do aplikacji. 'Console.WriteLine' nie generuje żadnych widocznych danych wyjściowych. –

Powiązane problemy