Каков принятый шаблон для приложения, которое может быть запущено как служба или как консольное приложение - PullRequest
4 голосов
/ 24 июня 2009

У меня есть проект, который развернут в производство в качестве службы Windows. Однако для локальной разработки было бы полезно запустить его как консольное приложение. На данный момент у меня есть класс Called ReportingHost, который обеспечивает мою основную функциональность, и класс ReportingServiceHost, который наследуется от ServiceBase и позволяет мне запускать приложение как сервис. Существует также программный класс с методом main, который вызывает ServiceBase.Run в моем ReportingServiceHost.

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

Я посмотрел на этот и попытался использовать этот код, но мое приложение закрывается немедленно, оно не показывает окно консоли и не ждет Enter перед закрытием.

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

Ответы [ 4 ]

9 голосов
/ 24 июня 2009

Я подозреваю, что ваш тестовый проект был сконфигурирован как exe для Windows, а не как консольный. С Windows Exe Console.ReadLine вернется немедленно.

Чтобы иметь консольный exe-файл, работающий как в качестве службы, так и в командной строке, запустите его как проект службы (в Visual Studio) - и добавьте проверку Environment.UserInteractive - т.е.

static void Main() {
    if(Environment.UserInteractive) {
        // code that starts the listener and waits on ReadLine
    } else {
        // run the service code that the VS template injected
    }
}

Конечно, вы также можете использовать переключатель командной строки. У меня есть пример на microsoft.public.dotnet.languages.csharp , который действует как:

  • установщик / деинсталлятор
  • услуга
  • приложение в консольном режиме

в зависимости от переключателей

2 голосов
/ 24 июня 2009

Мой совет? Положите всю свою логику для вашего сервиса в отдельную сборку. (Библиотека классов или DLL.) Затем создайте один проект как сервис, который ссылается на вашу библиотеку классов и помещает код для использования в качестве сервисов. Создайте второй консольный проект, который также ссылается на вашу библиотеку классов, но сделает ее доступной как консольное приложение. В результате вы получите три разных проекта в своем решении, но оно позволит вам отделить вещи. На самом деле, это позволило бы расширить ваш сервис и в нескольких других формах. Например, вы можете создать 4-й проект в качестве веб-службы и, таким образом, вызвать свою службу из веб-браузера в клиентской системе. Поскольку логика программного обеспечения отделена от логики использования, вы получаете большой контроль над ней.

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

2 голосов
/ 24 июня 2009

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

Если аргументы содержат /console, запустите версию консоли, в противном случае запустите службу.

Примерно так:

internal class MyService : ServiceBase { internal static void Main(string[] args) { if (args.Length == 0) { // run as a service.... ServiceBase[] servicesToRun = new ServiceBase[] {new MyService()}; Run(servicesToRun); } else { // run as a console application.... } } }

1 голос
/ 10 июля 2009

Выше уже есть два хороших ответа - но я подумал, что я опубликую ссылку на Отладочный самопровозглашаемый проект службы Windows Брайана Нойса сообщение в блоге - в нем говорится о WCF, но оно должно применяться к любым Служба Windows '.

Самое лучшее - это пример кода - если вы не можете понять, куда «подходят» вышеприведенные примеры, возьмите полный проект и посмотрите, как он работает. Спасибо Брайан !

...