Корректный способ реализовать консольное приложение C#?

  1. Загрузка без сценария без асинхронной работы
  2. Удалить загрузку
  3. Поместить < скрипт> внизу страницы, затем 4.

    < script type = "text / javascript"> window.addEventListener ('load', function () {helium.init ();}, false); < / script>

21
задан James 7 May 2009 в 19:14
поделиться

5 ответов

Сообщения об ошибках должны быть записаны в stderr или Console.Error, а нормальный вывод - в стандартный вывод Console.Out. Это особенно важно для консольных приложений типа «фильтр», чей вывод (stdout) может быть передан другому процессу, например, в пакетном файле.

Обычно, если вы столкнулись с ошибкой, напишите сообщение об ошибке в Console.Error и верните ненулевой результат. Или, если это исключение, просто не беспокойтесь о его обработке.

Чтобы вернуть код результата, вы можете передать его в качестве аргумента в Environment.Exit, установить свойство Environment.ExitCode или вернуть ненулевое значение from main.

Для простых консольных приложений я хотел бы:

  • иметь вспомогательный класс для анализа командной строки.

  • иметь класс фасадов, который предоставляет тестируемый API для функциональности, реализованной вашим инструментом командной строки. Как и большинство .NET API, это обычно выдает исключение, если возникает ошибка.

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

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

25
ответ дан 29 November 2019 в 21:06
поделиться

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

[Command("quit")]
public void QuitApp()
{
    ...
}

При запуске программы вы можете сканировать класс для таких методов и хранить делегаты, которые предназначаются для них в словаре, где ключи - команды. Это облегчает синтаксический анализ команд на основе поиска первого слова в словаре (амортизированный O (1)) и легко расширяется и обрабатывается в будущем, так как новые команды добавляются простым добавлением отдельных методов.

5
ответ дан 29 November 2019 в 21:06
поделиться

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

0
ответ дан 29 November 2019 в 21:06
поделиться

Для обработки в командной строке проверьте Mono.GetOptions. Это позволяет легко заполнять переменные из короткой (-f style) и длинной (--file style) опций командной строки.

2
ответ дан 29 November 2019 в 21:06
поделиться

Что касается аргументов командной строки, вы найдете различные схемы, но я всегда был поклонником

app.exe "self-explanatory arg" /noArgumentSwitch /argumentSwitch="argument"

Что касается кода возврата, вы можете изменить подпись своего Функция Main () возвращает int вместо void . Это позволит вам вернуть код вызывающему процессу, если необходимо.

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

2
ответ дан 29 November 2019 в 21:06
поделиться
Другие вопросы по тегам:

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