Створення Windows C # служб (сервісів)
Служби Windows (Windows NT services) - процеси, що володіють уніфікованим інтерфейсом для взаємодії з операційними системами Windows серії NT. Служби діляться на два типи - служби Win32, які взаємодіють з операційною системою за допомогою диспетчера управління службами (Service Control Manager - SCM), і драйвера, що працюють по протоколу драйвера пристрою (далі мова йде про службах Win32). Служби працюють у фоновому режимі, і їх робота прихована від користувача. В силу цього вони ідеально підходять для реалізації серверних процесів в архітектурі клієнт-сервер, мережевих служб, програм моніторингу та спорадично виконуваних програм.
Для створення служби в VS .NET необхідно виконати:
Створити проект рішення служби за допомогою спеціального шаблону Visual C # Projects - Windoes Service.
Написати функціональний код і код подій OnStart і OnStop.
Створити установники для служби (ProjectInstaller - для установки процесу і ServiceInstaller - для служби або служб проекту).
Створити виконуваний файл.
Створити проект установки.
Встановити і активізувати службу.
В меню File VS .NET вибераем New і Project. У діалоговому вікні New Project Project Types вибираємо Visual C # Projects, Template - Windows Service, задаємо Name, наприклад, MyFirstServicee, Location - визначаємо директорію, де будемо формувати проект.
Файл AssemblyInfo.cs "переїхав" в папку Properties.
Рис.1. Створення проекту рішення служби
На даному етапі нас цікавить файл з ім'ям Service1.cs. Service - ім'я класу проекту, спадкоємця класу System.ServiceProcess.ServiceBase.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
namespace MyFirstService
public class Service1. ServiceBase
.
Клас містить конструктор класу, функцію main і функції методів OnStart і OnStop. Методи OnPause (), і OnContinue () також можуть бути включені в проект (їх код може бути дописаний вручну, але методи не є обов'язковими).
// Конструктор класу
public Service1 ()
InitializeComponent ();
>
static void Main ()
>
protected override void OnStart (string [] args)
// Код, що виконується при старті процесу
>
protected override void OnStop (string [] args)
// Код, що виконується при зупинці процесу
>
У контекстному меню дизайнера форми (вкладка проекту Service1.cs [Design], правий клік мишки) вибираємо пункт Properties (якщо вкладка не видно - двічі кликнемо мишкою по імені файлу Servece1.cs в Solutation Explorer). Встановлюємо властивості (Рис.2.):
- ServiceName (ім'я проекту) - MyFirstService,
- AutoLog - True.
Рис.2. Установка властивостей сервісу
Тут можна змінити і коротке ім'я сервісу (властивість ServiceName).
На цьому проект рішення сервісу створений.
Написання функціонального коду сервісу
Для того, щоб переконатися в працездатності нашого сервісу, покладемо на нього завдання писати в певний лог файл якусь інформацію при старті і зупинці. Для цього:
Додамо простір імен:
using System.IO;
Оголосимо в класі Service1 StreamWriter:
private StreamWriter file;
Коди обробників подій запишемо наступним чином:
protected override void OnStart (string [] args)
// Файл за замовчуванням буде створений в "C: # 92; Winnt # 92; System32 # 92;"
file = new StreamWriter (new FileStream ( "MyFirstService.log",
System.IO.FileMode.Append));
this.file.WriteLine ( "MyFirstService стартував");
this.file.Flush ();
>
protected override void OnStop ()
this.file.WriteLine ( "MyFirstService зупинений");
this.file.Flush ();
this.file.Close ();
>
Пізніше ми додамо нашого сервісу іншу функціональність.
На вкладці Service1.cs [Design] викликаємо знову контекстне меню і пункт Add Instaler. У проект додається клас компонента, що містить два установника:
- ProjectInstaller - для установки служби і
- ServiceInstaller - для установки пов'язаного зі службою процесу.
Для ServiceInstaller1 відображаємо його властивості (контекстне меню Properties) і задаємо:
- ServiceName - MyFirstService,
- ServerType - Automatic.
Для ServiceProcessInstaller1 встановлюємо значення Account в LocalSystem (Рис.3.).
Створення виконуваного файлу для служби
У Solution Explorer вибираємо пункт Properties для вузла MyFirstServices. У діалоговому вікні вибираємо вкладку Application. Для пункту Startup object вибираємо в випадаючому списку MyFirstService.Programm (Рис.4.).
Рис.4. Установка властивостей для програми установки
У контекстному меню для вузла MyFirstServices вибираємо пункт Build. Після цього, проект побудований і в директорії проекту obj # 92; debug або obj # 92; release буде сформований файл MyFirstService.exe. Однак, спроба його запуску призведе до видачі повідомлення (Рис.5.):
Рис.5. Необхідність установки сервісу
Створення проекту установки для служби
В меню File вибираємо пункт Add Project і New Project. У діалоговому вікні Add New Project у вікні Project Types вибираємо вкладку Other Project Types гілка Setup and Deployment, у вікні Templates - Setup Project, задаємо Name і Location - обидва параметри непринципові (Рис.6.).
Рис.6. Додавання проекту рішення установки служби
Проект установки доданий в рішення і ми його бачимо в Solutation Explorer.
Крім того на вкладці File System (FirstServices) ми можемо бачити збірку файлів для установки "File System on Target Machine" (Рис.7.).
Рис.7. Створення проекту рішення установки служби
Наступне, що потрібно зробити - це визначити для установки директорію для проекту служби Windows.
Вибираємо вузол File System on Target Machine (якщо по якійсь причині ми не бачимо дерево папок, то можна його відобразити через контекстне меню вузла FirstServices, пункт View / File System), в його контекстному меню вибираємо Add Special Folder і System Folder. Ім'я System Folder з'явилося в галузі вузла File System on Target Machine.
У контекстному меню System Folder обираємо Add, Project Output # 92; Primary Output (Рис.8.).
Рис.8. Визначення директорії для служби
Вибираємо пункт View для вузла FirstServices пункт Custom Action, зліва у вікні відкриються за замовчуванням чотири можливих дії для інсталятора: Install, Commit, Rollback і Uninstall. Для Install і Uninstall через їх контекстне меню виконуємо пункт Add Custom Action і вказуємо System Folder (Рис.9.).
Рис.9. Визначення дій інсталятора
Практично, ми визначили не тільки дію, але і об'єкт цієї дії - Primary output from MyFirstService (Active). В дані вузли призначених для користувача дій (Install і Uninstall) буде додано основний вихідний файл проекту. У властивостях можна змінити для файлу CustomInstaller, значення true повідомляє інсталятору, що використовується клас інсталятора (Рис.10.).
Рис.10. Визначення дій інсталятора
Тепер можна побудувати проект інсталятора, викликавши для вузла FirstServices в Solutation Explorer пункт Build.
Для установки служби в Solutation Explorer вибираємо проект установки (FirstServices) і в контекстному меню пункт Install. В результаті, буде запущений Setup Wizard. На другому кроці його роботи задамо системну папку Windows - C: # 92; WINDOWS # 92; system32 # 92 ;. Після закінчення роботи Setup Wizard служба буде встановлена.
Щоб запустити і зупинити службу відкриємо диспетчер управління службами (в Windows XP - Start / Programm / Administrative Tools / Services). Ім'я нашої служби MyFirstService буде відображено у вікні Services, і можна звичайним чином запустити наш сервіс через контекстне меню пункт Start (крім того, служба автоматично буде запускатися при перевантаженні комп'ютера).
Наш сервіс (служба) створив файл Service1.log в "C: # 92; windows # 92; System32 # 92; і виконав в нього запис про своє старті. При зупинці сервісу запис буде виконана знову.
Службу можна встановлювати і видаляти, використовуючи файли setup.exe і FirstServices.msi, які після побудови установника знаходяться в каталозі, де був створений проект інсталятора В даному прикладі в C: # 92 ;. # 92; FirstService # 92; Debug # 92; і, крім того, цих двох файлів досить для установки служби з будь-якої директорії будь-якого комп'ютера.
На даному етапі ми виконали всі необхідні кроки і перевірили нашу службу в роботі. Далі, можна виконати побудову проекту в режимі Release (меню Build, Configuration Manager, Release). setup.exe і FirstServices.msi, після побудови установника будуть знаходяться в каталозі C: # 92 ;. # 92; FirstServices # 92; bin # 92; Release). Далі можливо наповнювати функціональність служби на свій розсуд.
Видалення сервісу з комп'ютера виконується як і звичайного застосування Windows - (Settings / Control Panel / Add on Remove Programs).
Для завдання простого механізму опитування можна скористатися компонентом System.Timers.Timer. У методі OnStart можна задати параметри компонента. Таймер буде виконувати в коді періодично деякі дії (наприклад, запис у файл поточного часу, як це показано нижче). У код лише доданий компонент Timer і обробник події, що виконує деякі дії після закінчення заданого властивістю timer1.Interval часу.
namespace MyFirstService
public class Service1. ServiceBase
private StreamWriter file;
// Визначаємо таймер
private System.Timers.Timer timer1;
protected override void OnStart (string [] args)
file = new StreamWriter (new FileStream ( "Service1.log",
System.IO.FileMode.Append));
this.file.WriteLine ( "MyFirstService стартував");
this.file.Flush ();
// Створюємо таймер і виставляємо його параметри
this.timer1 = new System.Timers.Timer ();
this.timer1.Enabled = true;
// Інтервал 10000мс - 10с.
this.timer1.Interval = 100000;
this.timer1.Elapsed + =
new System.Timers.ElapsedEventHandler (this.timer1_Elapsed);
this.timer1.AutoReset = true;
this.timer1.Start ();
>
protected override void OnStop ()
this.timer1.Stop ();
this.file.WriteLine ( "MyFirstService зупинений");
this.file.Flush ();
this.file.Close ();
>
private void
timer1_Elapsed (object sender, System.Timers.ElapsedEventArgs e)
// Записуємо час в файл або робимо все, що хочемо
this.file.WriteLine (DateTime.Now.ToString ( "dd.MM.yyyy HH: mm: ss"));
this.file.Flush ();
>