Запуск консольного приложения c# в качестве службы Windows
у меня есть базовое консольное приложение c#, которое я хотел бы запустить как службу Windows.
Я создал службу Windows, используя sc create
. Это сработало отлично, и я могу видеть свою службу под services.msc
. Когда я пытаюсь запустить эту службу, я получаю следующую ошибку:
не удалось запустить службу проекта на локальном компьютере. Ошибка 1053: служба не ответила на запрос запуска или управления своевременно.`
Я читал это может быть связано с тем, что код службы занимает больше времени, чем 30000 мс для выполнения. Поэтому я удалил основную часть кода, так что почти ничего не выполняется.. однако та же ошибка сохраняется.
Я использую .NET 3.5 для этого проекта.
что может быть причиной?
6 ответов
вы не можете просто взять любое консольное приложение и запустить его как службу Windows. Сначала вам нужно реализовать свой класс обслуживания, который будет наследовать от ServiceBase
, затем в точке входа (Main
) нужно запустить службу с ServiceBase.Run(new YourService())
. В своем классе обслуживания вам нужно определить, что происходит при запуске и завершении службы.
В идеале вы также должны добавить ServiceInstaller в свою сборку. Таким образом, Вы сможете предустановить свои свойства сервиса и использовать installutil.exe для установки услуга.
создание приложения служб Windows в конструкторе компонента - пошаговое руководство по созданию сервиса.
не любое старое приложение может быть запущено как служба, особенно в более поздних версиях Windows. Ожидается, что они будут поддерживать определенные функции, отвечать на определенные запросы и (опять же, в последних версиях Windows) не взаимодействовать с пользователем напрямую.
Если вам нужна служба, напишите приложение, специально разработанное для службы.
Я не знаю, что такое "sc create". Но я знаю, что с помощью Visual Studio 2010 можно создать проект службы Windows. Кстати, я создал проект такого рода, и он работает хорошо на всем пути.
почему это так? - вулфгар.про 3 июня ' 11 в 1: 13
@WulfgarPro-потому что приложение службы windows имеет немного другая архитектура. Вы должны определить, что делать, когда служба начинается и заканчивается. - Алекс Аза 3 '11 июня в 1: 15
(к сожалению, я пока не могу написать комментарий.) Это связано с тем, что SCM (Service Control Manager) управляет классом ServiceBase службы через ServiceBase. Если бы только нужно было определить, что он делает, когда он запускается и останавливается, не будет необходимости в наследовании и переопределении. Можно просто создать эти два метода. К сожалению, есть немного больше работы, потому что например содержит немного больше функций.
У меня был большой успех с TopShelf. Это пакет nuget, который позволяет вашему консольному приложению .NET также иметь необходимые крючки службы Windows, чтобы он мог с радостью работать как консольное приложение (полезно для отладки) или быть установлен как служба Windows.