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

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

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

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

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

Ответы на вопрос(4)

Решение Вопроса

что ваш тестовый проект был настроен как exe для Windows, а не как для консоли. С windows exeConsole.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 который действует как:

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

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

 Carl Hörberg13 июл. 2009 г., 00:53
Чтобы сделать VS порождающим окна консоли для вас, когда вы нажмете F5 с этим решением, вы должны изменить свойства проекта, на вкладке «Приложение» установить «Вывести в консольное приложение». Насколько я могу судить, он по-прежнему будет работать и самостоятельно, как служба.
 Marc Gravell♦13 июл. 2009 г., 01:04
@ Карл ... да, я сказал "console exe" в ответе ...

внедряя обычную службу 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....
        }
    }
}

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

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

Брайан Нойес: «Самостоятельный отладочный проект службы Windows сообщение в блоге - в нем говорится о WCF, но оно должно относиться к любой «службе Windows».

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

Ваш ответ на вопрос