2011-08-26 3 views
42

В настоящее время у меня есть приложение с графическим интерфейсом.Приложение C# как GUI, так и командная строка

Можно ли использовать это же приложение из командной строки (без GUI и с использованием параметров).

Или мне нужно создать отдельный .exe (и приложение) для инструмента командной строки?

+0

вы можете абсолютно использовать то же самое приложение. Просто добавьте 'string [] args' к вашему основному методу –

+0

Или, посмотрите ответы на этот вопрос: http://stackoverflow.com/questions/1179532/ –

+0

Поскольку вы не просите о чтении ввода с консоли (только из параметров командной строки), это обман. –

ответ

55
  1. редактировать свои свойства проекта, чтобы сделать ваше приложение по "Windows Application" (не "консольное приложение"). Вы все равно можете принимать параметры командной строки. Если вы этого не сделаете, откроется окно консоли, когда вы дважды щелкните значок приложения.
  2. Убедитесь, что функция Main принимает параметры командной строки.
  3. Не показывайте окно, если вы получаете параметры командной строки.

Вот краткий пример:

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

Если ваше приложение уже не структурированы, чтобы аккуратно делать бесшумный обработки (если вся ваша логика застревает в код WinForm), вы можете hack silent processing in ala CharithJ's answer.

EDIT by OP Извините, что захватил ваш ответ Мерлин. Просто хочу всю информацию здесь для других.

Чтобы иметь возможность писать на консоль в приложении WinForms просто сделать следующее:

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

'если вся ваша логика застряла в вашем коде WinForm'. Это: P Это хорошая вещь, хотя, поскольку я полный новичок, и потому что это «укусит меня в задницу», теперь я запомню это для будущих проектов. Думаю, у меня есть какая-то уборка. – PeeHaa

+0

последний вопрос перед сном: смогу ли я написать сообщение в командной строке, когда, например, программа завершена? Или это либо отдельное приложение, которое может писать в командной строке, либо не писать в командной строке? – PeeHaa

+0

@PeeHaa: Кажется, я не могу заставить его работать, но попробуйте googling: «AttachConsole Console.WriteLine» * или * «AllocConsole Console.WriteLine». Вместо этого я бы предложил использовать библиотеку протоколирования, например: http://netcommon.sourceforge.net/ (в паре с NLog). –

-2

Я думаю, что возможно, просто установите подсистему на «консоль», вы увидите окно консоли, а также окно GUI.

Но для того, чтобы принимать команды из окна консоли, я думаю, вам придется создать дополнительный поток, чтобы сделать это.

+0

Это не очень хороший вариант, потому что это вызовет дополнительную консоль, если они запустили ее, дважды щелкнув значок файла. Кроме того, вам необязательно запускать другой поток - например, если вы передаете свои «команды» через параметры командной строки. –

-1

Возможно, вам потребуется структурировать приложение как консольное приложение, определить, что вы делаете в «Действиях» - например, щелчок кнопки - в отдельный класс, включить форму, которая может быть показана, если не было аргументов командной строки , и обрабатывать события путем маршрутизации их к общим методам в вашем классе «Действие».

+1

Не делайте это консольным приложением. В противном случае консоль появится, когда вы запустите ее как графический интерфейс. –

9

В вашем классе program.cs сохраняйте метод Main как есть, но добавьте string[] Args в основную форму. Например ...

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

В mainform.cs конструктору

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

лучший способ сделать это – xbonez

+2

+1; Но даже не делайте 'Application.Run', если вы используете консольное приложение. Скрытие окна будет работать, но это хак :) –

+3

Недостатком является то, что вы не сможете увидеть какой-либо вывод в окне консоли, так как нет реального окна консоли, прикрепленного к приложению. 'Console.WriteLine' не будет выдавать видимый результат. –

Смежные вопросы