Запуск консольного приложения C # в качестве службы Windows - PullRequest
7 голосов
/ 03 июня 2011

У меня есть базовое консольное приложение C #, которое я хотел бы запустить в качестве службы Windows.

Я создал службу Windows, используя sc create. Это работало нормально, и я могу видеть мой сервис под services.msc. Когда я пытаюсь запустить этот сервис, я получаю следующую ошибку:

Не удалось запустить службу PROJECT на локальном компьютере. Ошибка 1053: служба не ответила на запрос запуска или управления своевременно.

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

Я использую .NET 3.5 для этого проекта.

Что может вызвать это?

Ответы [ 6 ]

9 голосов
/ 03 июня 2011

Вы не можете просто взять любое консольное приложение и запустить его как службу Windows.Сначала вам нужно реализовать класс обслуживания, который наследуется от ServiceBase, затем в точке входа (Main) вам нужно запустить службу с ServiceBase.Run(new YourService()).В вашем классе обслуживания вам нужно определить, что происходит, когда служба запускается и заканчивается.

В идеале вам следует добавить ServiceInstaller и в вашу сборку.Таким образом, вы сможете предварительно настроить свойства службы и использовать installutil.exe для установки службы.

3 голосов
/ 03 июня 2011
0 голосов
/ 08 марта 2015

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

0 голосов
/ 15 мая 2013

почему это так?- wulfgar.pro 3 июня 2011 года в 1:13

@ WulfgarPro - потому что приложение службы Windows имеет немного другую архитектуру.Вам необходимо определить, что делать, когда сервис начинается и заканчивается.- Алекс Аза 3 июня 11 в 1: 15

(К сожалению, я пока не могу написать комментарий.) Это потому, что SCM (Service Control Manager) контролирует службучерез класс ServiceBase.Если бы нужно было только определить, что он делает, когда он начинается и останавливается, не было бы необходимости в наследовании и переопределении.Можно просто создать эти два метода.К сожалению, требуется немного больше работы, потому что ServiceBase содержит немного больше функциональности.

0 голосов
/ 03 июня 2011

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

Если вам нужна услуга, напишите приложение, специально предназначенное для службы.

0 голосов
/ 03 июня 2011

Я не знаю, что такое "sc create". Но я знаю, что с помощью Visual Studio 2010 можно создать проект службы Windows. Кстати, я создал проект такого рода, и он хорошо работает все время.

...