Запуск консольного приложения 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.