2009-07-13 4 views
5

В целях обучения я разрабатываю приложение генерации класса в C# и winforms. Я думаю, что было бы неплохо включить режим командной строки, позволяющий использовать приложение в скриптах.Должен ли я включать режим командной строки в свои приложения?

В моих приложениях рекомендуется включить режим командной строки? Было бы лучше иметь две разные программы: одну с GUI в одной для командной строки?

ответ

9

На самом деле наличие приложения C# должно быть как консольным, так и графическим интерфейсом. Запускаются консольные приложения (/t:exe), после чего командное приглашение ждет их завершения. Приложения GUI (/t:winexe) командная оболочка запускает их, а затем немедленно возвращает. Хотя вы можете создавать и запускать формы из «консольного» приложения, всегда будет отображаться фоновая консоль. С другой стороны, приложение «Forms» не имеет подключенных stdin, stdout и stderr и, хотя они могут вести себя как инструменты командной строки и аргументы команды процесса, у них возникают проблемы при встраивании в скрипты (поскольку стандартный ввод/вывод не является подключен).

Если вы хотите выявить функциональность как из приложений с графическим интерфейсом, так и с помощью пакетной обработки сценариев/протоколов, лучший способ состоит в том, чтобы скомпилировать ваши функциональные возможности в библиотеку классов, а затем создать два отдельных приложения (один GUI-консоль), которые использовать эту библиотеку.

+0

Вы также можете создать окно вывода консоли в приложении winexe, используя некоторые элементы win32-api (AllocConsole/AttachConsole), однако у них все еще есть некоторые проблемы, поскольку в нем нет правильной подсистемы. –

+0

@ Джаспер: конечно, я думаю, вы даже можете пойти после FCB с индексом 0,1 и 2, но я бы действительно держался подальше от этого, просто пойдите с потоком, а не сражайтесь с текущим вверх по течению;) –

+0

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

2

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

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

1

Создание приложения на платформе Windows, которое ведет себя корректно как консольное приложение, может быть проблематичным, это проблема с архитектурой ядра Windows, поскольку они считаются двумя различными типами приложений (у них есть другая подсистема, которую вы обычно указываете в параметры компилятора или компоновщика). Вы все же можете вручную перенаправить IO и открыть консоль из приложения win32 функцией win32 AllocConsole() и друзьями, но у этого также есть некоторые проблемы. См. This Old New Thing post для получения дополнительной информации.

+0

, я должен был, хотя у Раймонда есть сообщение об этом уже LOL –

1

Если вы хотите, чтобы ваша утилита/программа запуска выполнялась в скриптах, вы можете открыть ее как COM.

Многие языки сценариев для окон имели возможность использовать COM-объекты напрямую.

5

Я не C# программист, но когда я программировать на C++, я считаю, что наиболее полезно:

1.) Создайте как разделяемую библиотеку с C, а также C++ API для выполнения основного приложения функциональность.

2.) Создайте один или несколько двоичных файлов командной строки, доступных интерпретатору оболочки.

3.) Создайте графическое приложение для типичных конечных пользователей, реализованное с помощью библиотеки (не путем вызова двоичных файлов).

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

2

Я согласен с michaelsafyan о создании библиотеки с функциональностью ядра.

Я бы добавил, что вы также должны проверить командлеты powershell.

Активность командной строки будет мигрировать в PowerShell, и это приносит много к таблице.

http://en.wikipedia.org/wiki/Windows_PowerShell

2

Я очень часто создают такую ​​утилиту как API. Если мне нужно использовать его из простой утилиты командной строки, это легко - он просто вызывает API. Если командная строка становится слишком сложной, возможно, пришло время для приложения Winforms, которое также может вызвать API. Если бы я хотел использовать его из PowerShell или из задачи MSBUILD, это все еще просто - они просто называют API.

0

Я согласен с @Remus Rusanu.

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

и одна другая польза от него есть вы можете даже не нужно создать приложение командной строки, как вы можете получить доступ к .net функции DLL с помощью PowerShell ..

вы можете найти один пример по here

0

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

Есть много вариантов того, что вы можете вставлять. Lua является одним из самых популярных и предназначенных именно для этой цели и является отличным выбором.

Однако, для приложения общего назначения, я бы посмотрел на внедрение Python. Python настолько популярен, что у вас будет большая группа людей, которые хотят приложить усилия для написания сценария для вашего приложения.

1

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

Несколько слов о женившись CLI & GUI на Windows: приложение окна либо приложение GUI или консольное приложение, но не обоих. Это проблема ОС, и, вероятно, с ней ничего не поделаешь. Консольная подсистема в Windows ужасна, и PowerShell не изменил ее.

Ваши варианты реализации на Windows, являются:

  • из двух файлов подход:

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

  • консоль мерцающий подход:

Компиляция приложения с графическим интерфейсом консольным режимом на, а затем сразу же после запуска графического интерфейса можно назвать FreeConsole(), чтобы закрыть его. Это немного раздражает, но работает. Плохо: теперь у вас есть мерцающее окно консоли. Pro: еще один файл.

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