Подтвердить что ты не робот

Правильный способ внедрения консольного приложения С#?

Каков правильный способ внедрения и архивирования инструмента командной строки в качестве консольного приложения С#?

Обеспокоенность по поводу обращения включает в себя правильный анализ переменных командной строки и правильный способ вывода текста. Хотя Console.WriteLine() является наиболее очевидным выбором для вывода, каковы обстоятельства, при которых следует вместо этого писать запись в стандартный поток ошибок .Error,.SetErrorStream и т.д.

Каков правильный способ выхода приложения при возврате правильного кода возврата в вызывающую команду?

Как должно быть выполнено событие CancelKeyPress для прерывания программы? Это только для использования, когда асинхронная операция происходит в отдельном потоке?

Есть ли краткое руководство по программированию инструмента командной строки на С# или даже лучше проект или шаблон с открытым исходным кодом, который я мог бы использовать для правильного внедрения относительно простого инструмента?

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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