Приложение .NET, работающее как Windows Form или как консольное приложение - PullRequest
15 голосов
/ 11 мая 2010

Я хочу, чтобы одно из моих приложений Windows Forms запускалось программно - из командной строки. При подготовке я отделил логику в своем классе от формы. Теперь я застрял, пытаясь заставить приложение переключаться назад и вперед на основе наличия аргументов командной строки.

Вот код для основного класса:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        string[] args = Environment.GetCommandLineArgs();
        if (args.Length > 1) // gets passed its path, by default
        {
            CommandLineWork(args);
            return;
        }         

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

    private static void CommandLineWork(string[] args)
    {
        Console.WriteLine("It works!");
        Console.ReadLine();
    }

, где Form1 - моя форма, а строка It works! - просто заполнитель для реальной логики.

Прямо сейчас, при запуске этого из Visual Studio (с аргументами командной строки) фраза It works! выводится на вывод. Однако при запуске файла /bin/Debug/Program.exe (или, соответственно, / Release) происходит сбой приложения.

Правильно ли я поступаю? Будет ли разумнее (т. Е. Занимать меньше времени на разработку), чтобы мой класс логики был DLL, которая загружается двумя отдельными приложениями? Или есть что-то совершенно другое, о чем я не знаю?

Заранее спасибо!

Ответы [ 4 ]

24 голосов
/ 12 мая 2010

Вам потребуется P / Invoke AllocConsole (), если вы обнаружите аргумент командной строки. Проверьте мой ответ в этой теме на наличие необходимого кода. Образец C # находится дальше вниз по странице. Повторил здесь, потому что я не доверяю этому грязному сайту форума:

using System;
using System.Windows.Forms;

namespace WindowsApplication1 {
  static class Program {
    [STAThread]
    static void Main(string[] args) {
      if (args.Length > 0) {
        // Command line given, display console
        AllocConsole();
        ConsoleMain(args);
      }
      else {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
      }
    }
    private static void ConsoleMain(string[] args) {
      Console.WriteLine("Command line = {0}", Environment.CommandLine);
      for (int ix = 0; ix < args.Length; ++ix)
        Console.WriteLine("Argument{0} = {1}", ix + 1, args[ix]);
      Console.ReadLine();
    }

    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
    private static extern bool AllocConsole();
  }
}
1 голос
/ 13 августа 2012

Перейти к свойствам проекта

На вкладке Приложение вы увидите раскрывающийся список с именем Тип вывода . Измените это на Консольное приложение .

Там у вас есть окно и консоль. Теперь ваш код с аргументом команды должен работать.

1 голос
/ 11 мая 2010

Не уверен, если это имеет значение, но вместо

static void Main()
{
        string[] args = Environment.GetCommandLineArgs();

вы можете вместо этого поставить

static void Main(string[] args)
{
1 голос
/ 11 мая 2010

Да, было бы лучше сделать два внешних .exes (один для командной строки и один для управления окнами).

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...