Служба Windows – это специальная служебная программа, которая запускается операционной системой автоматически при загрузке вне зависимости от статуса пользователя или вручную (в зависимости от настроек).
Службы работают в фоновом режиме и, как правило, выполняют различные технологические задачи.
Также, в отличие от «обычных» программ, службы не имеют графического интерфейса и управляются при помощи специального диспетчера.
Мы не станем вдаваться в подробности работы служб Windows как таковой потому, что она достаточно подробно описана в литературе по работе с Windows.
В этой статье мы рассмотрим пример создания службы Windows с использованием языка программирования C#.
Создание службы
Для того, чтобы создать проект службы необходимо в окне создания нового проекта выбрать пункт «Служба Windows».
После этого Visual Studio создаст новый проект с «каркасом» службы.
К сожалению, в отличие, например, от Windows Forms или консольного приложения данный «каркас» не самодостаточен. То есть, установить в систему и запустить в работу такую «пустую» службу нельзя. Необходимо дописать рабочий функционал и логику установки в систему.
В качестве примера создадим службу, которая будет каждую секунду записывать в текстовый файл текущее время.
Во избежание возможных проблем в будущем, настоятельно рекомендуется рабочий функционал выносить в отдельный класс.
Ниже представлен такой класс для нашей службы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class TimeLogger { Timer timer; // Запуск процесса записи public void Start() { timer = new Timer(1000); timer.Elapsed += this.Log; timer.Start(); } // Завершение записи public void Stop() { timer.Stop(); } // Собственно запись private void Log(Object source, ElapsedEventArgs e) { using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Test.txt", true)) { file.WriteLine(DateTime.Now.ToString()); } } } |
Теперь, с одной, стороны, у нас есть всё необходимое для работы, но, в то же, время мы пока не можем это никак использовать. Нам необходимо реализовать запуск службы в работу и её остановку.
Для этого в шаблоне проекта предусмотрен специальный файл, который по умолчанию называется Service1.cs. В нём расположен класс, который является наследником класса ServiceBase представляющего основу служб Windows. По сути, этот файл собственно и является будущей службой.
В нём нам требуется описать объект описанного ранее класса в качестве поля и обработать два события. OnStart (запуск службы) и OnStop (её остановка).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public partial class ServiceTest : ServiceBase { private TimeLogger logger; public ServiceTest() { InitializeComponent(); } protected override void OnStart(string[] args) { logger= new TimeLogger(); Thread loggerThread = new Thread(new ThreadStart(logger.Start)); loggerThread.Start(); } protected override void OnStop() { logger.Stop(); } } |
Наша служба уже готова к работе, но прежде чем её запустить необходимо установить её в систему.
Visual Studio не предоставляет готового установщика поэтому его нам придётся написать самостоятельно.
Вначале добавим в наш проект класс установщика.
Весь процесс установки описывается в конструкторе класса установщика.
При помощи объектов классов ServiceInstaller и ServiceProcessInstaller мы задаём для службы учётную запись, режим запуска и имена, как это показано ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[RunInstaller(true)] public partial class InstallerTestService : System.Configuration.Install.Installer { ServiceInstaller serviceInstaller; ServiceProcessInstaller processInstaller; public Installer1() { InitializeComponent(); serviceInstaller = new ServiceInstaller(); processInstaller = new ServiceProcessInstaller(); // Учётная запись для службы processInstaller.Account = ServiceAccount.LocalSystem; // Режим запуска (в данном случае Manual (вручную)). // Если служба не является драйвером устройства допустимы только значения Manual, Authomatic (автоматический запуск при загрузке системы) и Disabled (отключено). serviceInstaller.StartType = ServiceStartMode.Manual; // Имя службы (должно совпадать с именем класса службы). serviceInstaller.ServiceName = "ServiceTest"; // Отображаемое имя службы. Под ним служба будет отображаться в различных утилитах для работы со службами Windows. // Это необязательные параметр. При его отсутствии будет отображаться ServiceName. serviceInstaller.DisplayName = "Служба ServiceTest"; Installers.Add(processInstaller); Installers.Add(serviceInstaller); } } |
После написания установщика разработка нашей службы завершена и мы можем её установить и запустить в работу.
Установка и удаление службы
К сожалению, Visual Studio не позволяет установить и запустить службу непосредственно из IDE. Вместо этого нужно воспользоваться специальной консольной утилитой InstallUtil.exe.
Эта утилита располагается в следующей папке:
- Для 32-разрядных систем:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319 - Для 64-разрядных систем:
C:\Windows\Microsoft.NET\Framework\v4.0.30319
Для установки службы нужно передать InstallUtil.exe полный путь к её исполняемому файлу. В качестве примера файл размещён в папке C:\ServiceTest.
1 |
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ InstallUtil.exe" "C:\ServiceTest\ServiceTest.exe" |
После выполнения данной команды в консоли служба будет установлена в системе и её можно будет запустить в работу.
Если требуется деинстраллировать службу, это можно сделать при помощи той же команды с флагом u.
1 |
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ InstallUtil.exe" "C:\ServiceTest\ServiceTest.exe" /u |
Добавить комментарий