Как создать программу Windows Forms, которая также может запускаться из командной строки - PullRequest
4 голосов
/ 16 октября 2011

Я создал программу, которая имеет два проекта: интерфейс Windows и «движок». Я хотел бы сделать так, чтобы пользователь мог выполнить программу из командной строки, передавая некоторые аргументы, и механизм автоматически выполнит их и выложит результаты. ИЛИ пользователь может запустить пользовательский интерфейс и выбрать все свои параметры в раскрывающихся списках и т. Д., А затем нажать кнопку, чтобы сообщить движку, что он работает. На самом деле у меня уже есть работа с использованием чего-то, что я нашел давным-давно, но я пытаюсь понять, есть ли более простой способ. Я нашел способ добавить класс Win32 и создать внешние компоненты для AllocConsole, FreeConsole и AttachConsole из kernel32.dll. Есть ли более простой способ? Спасибо.

Ответы [ 3 ]

3 голосов
/ 16 октября 2011

это просто, сделайте ваше приложение Windows Form и в методе Main проверьте параметры командной строки и, если ваши параметры есть, вместо вызова

Application.Run(new Form1());

просто вызовите свой двигатель и начните обработку.

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

мы используем этот подход во многих программах, и мы удовлетворены, если вы не вызовете Application.Run(...), ваша программа просто завершится, когда закончится метод Main.

1 голос
/ 16 октября 2011

Создайте четыре отдельные конфигурации, две для графического интерфейса и две для консоли:

DebugConsole, DebugGui, ReleaseConsole, ReleaseGui

Приведенный выше снимок экрана предназначен для конфигураций решения. Вам придется сделать то же самое еще раз для проекта (на приведенном выше снимке экрана проект с этими четырьмя конфигурациями называется Rummage) , Вот выдержка из Rummage.csproj:

[...]
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugGui|AnyCPU' ">
    <OutputType>WinExe</OutputType>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseGui|AnyCPU' ">
    <OutputType>WinExe</OutputType>
    <Optimize>true</Optimize>
    <DefineConstants>TRACE</DefineConstants>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugConsole|AnyCPU'">
    <OutputType>Exe</OutputType>
    <DefineConstants>DEBUG;TRACE;CONSOLE</DefineConstants>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseConsole|AnyCPU'">
    <OutputType>Exe</OutputType>
    <DefineConstants>TRACE;CONSOLE</DefineConstants>
    <Optimize>true</Optimize>
  </PropertyGroup>
[...]

Обратите особое внимание:

  • Конфигурации консоли имеют <OutputType>Exe</OutputType> (что делает их консольным приложением), в то время как конфигурации выпуска имеют <OutputType>WinExe</OutputType>.

  • В обеих конфигурациях консоли определена постоянная CONSOLE. Таким образом, вы можете использовать #if CONSOLE [...] #else [...] #endif, чтобы иметь специфичный для консоли / GUI код. Например, метод Main может выглядеть так:

    [STAThread]
    static int Main(string[] args)
    {
        #if CONSOLE
            return MainConsole(args);
        #else
            return MainGui(args);
        #endif
    }
    

    ... а затем вы можете получить материал WinForms в MainGui и файл синтаксического анализа командной строки в MainConsole.

Таким образом, вы можете запускать (и отлаживать) либо графический интерфейс, либо консольную версию в Visual Studio, а в сценарии сборки вы можете просто собрать их все (и в разные каталоги, или в разные имена файлов EXE).

1 голос
/ 16 октября 2011

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

Пусть приложение WinForms беспокоится о графическом интерфейсе, а приложение Console - о командной строке.

...