Приложение.NET, работающее или как Windows Form или как Консольное приложение

Я надеюсь иметь одно из своих приложений 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 (или Выпуск / в этом отношении) сбои приложения.

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

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

15
задан John Saunders 11 May 2010 в 19:58
поделиться

3 ответа

Вам нужно будет выполнить 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();
  }
}
24
ответ дан 1 December 2019 в 02:37
поделиться

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

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

вместо

static void Main(string[] args)
{
1
ответ дан 1 December 2019 в 02:37
поделиться

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

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

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

1
ответ дан 1 December 2019 в 02:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: