Приложение CLI и GUI - PullRequest
       15

Приложение CLI и GUI

3 голосов
/ 13 марта 2012

Я пишу приложение, которое имеет как CLI, так и GUI.

Я прочитал большинство вопросов и статей, касающихся этого, и нашел очень полезным этот вопрос:

Может ли один исполняемый файл бытьи консоль, и приложение с графическим интерфейсом?

Мой окончательный код выглядит так:

        if (args.Length > 0)
        {
            //console code            
        }
        else
        {
            FreeConsole();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form());
        } 

Это прекрасно работает при запуске .exe с помощью двойного щелчка, или при отладке, или из консолис аргументами.

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

Этонехарактерный графический интерфейс и поведение консоли.Консоль обычно запускает графический интерфейс и не ждет его выхода, а только для новых команд.

Есть ли способ избежать этого?

Ответы [ 6 ]

0 голосов
/ 01 ноября 2015

Лучший подход к написанию приложения, работающего в режиме GUI / CLI / CUI / Network, - это использование libgreattao.

Найдите его на sourceforge.net.

Libgreattao разъединяет бизнес-логику и механизм связи, поэтому вы можете разместить связанный с libgreattao код повсюду в вашей программе.

0 голосов
/ 13 марта 2012

Нужно запустить приложение с графическим интерфейсом без консоли? В командной строке введите:

start "[title not necessary for gui exe]" "full path to .exe"

См. здесь

0 голосов
/ 13 марта 2012

Это выглядит правильно. Вы запускаете команду, которая возвращается только тогда, когда приложение остановлено.

Если вы не хотите ждать, пока он вернется, запустите его в новом потоке. (ThreadPool, Thread, Task, async / await в C # 5.0 => выберите свою любимую).

0 голосов
/ 13 марта 2012

Обычный способ сделать это состоит в том, чтобы абстрагировать представление от логики, а затем иметь два exes, один CLI, один GUI, чтобы не было ни одного, который мог бы быть.Пройдя по этому маршруту, вы получите какой-то ужасный компромисс с преимуществами ни одного подхода.Графический интерфейс с параметрами командной строки - это не приложение CLI, это графический интерфейс с невидимым / недолгим окном.

0 голосов
/ 13 марта 2012

Возможно, это не ответ на ваш прямой вопрос, но с этим двойным решением вы напрашиваетесь на неприятности :) Это взлом, который будет работать в некоторых случаях, но в других нет.

Правильным решением было бы исключить функциональность и логику приложения в отдельной библиотеке классов, а затем и из консоли, и из приложения с графическим интерфейсом вызвать этот «движок». Поместите все эти три проекта в одно решение Visual Studio. Вся функциональность и подавляющее большинство кода должны быть в этой библиотеке классов, проекты GUI и консоли будут иметь дело только с теми конкретными аспектами, которые зависят от среды (например, событие нажатия кнопки будет только в приложении GUI и т. Д.)

0 голосов
/ 13 марта 2012

Принятый ответ на вопрос, на который вы ссылались, содержит этот отрывок:

Второй метод Junfeng - это то, что использует ildasm.Он цитирует процесс, через который прошел автор ildasm при его запуске в обоих режимах.В конечном счете, вот что она делает:

Программа помечена как двоичный файл в режиме консоли, поэтому она всегда начинается с консоли.Это позволяет перенаправлению ввода и вывода работать как обычно.Если программа не имеет параметров командной строки в консольном режиме, она перезапускается сама.Недостаточно просто вызвать FreeConsole, чтобы первый экземпляр перестал быть консольной программой.Это потому, что процесс, который запустил программу, cmd.exe, «знает», что он запустил программу в консольном режиме и ожидает остановки программы.Вызов FreeConsole привел бы к остановке ildasm при использовании консоли, но не заставил бы родительский процесс начать работу с консоли.

Для меня это выглядит головной болью, когда двоичный файл пытается переключаться между консольюПодсистема и графическая подсистема (что на самом деле не разрешено) требует больше усилий, чем стоит.

Один из подходов - создать отдельное приложение с графическим интерфейсом .exe.Всякий раз, когда консольное приложение запускается без параметров, оно запускает приложение с графическим интерфейсом и закрывается.

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

...