Учебник создание приложения службы windows

Раздел 9. Создание Windows C# служб (сервисов) в Visual Studio NET

Аннотация: Данный материал был написан после того, как попытка создать сервис по материалу, изложенному в MSDN, многократно заставляла задумываться над тем, что же хотели сделать авторы и, почему именно так, а не так, как надо. В результате этого, появилось это рабочее обобщение, которым автор и сам теперь пользуется, когда возникает необходимость создания или модернизации сервисов.

Глава 1. Создать сервис это просто

Службы Windows (Windows NT services) — процессы, обладающие унифицированным интерфейсом для взаимодействия с операционными системами Windows серии NT. Службы делятся на два типа — службы Win32, взаимодействующие с операционной системой посредством диспетчера управления службами (Service Control Manager — SCM), и драйвера, работающие по протоколу драйвера устройства (далее речь идет о службах Win32). Службы работают в фоновом режиме, и их работа скрыта от пользователя. В силу этого они идеально подходят для реализации серверных процессов в архитектуре клиент-сервер, сетевых служб, программ мониторинга и спорадически выполняемых программ.

Для создания службы в VS .NET необходимо выполнить:

Создать проект решения службы с помощью специального шаблона Visual C# Projects — Windows Service.

Написать функциональный код и код событий OnStart и OnStop.

Создать установщики для службы (ProjectInstaller — для установки процесса и ServiceInstaller — для службы или служб проекта).

Создать исполняемый файл.

Создать проект установки.

Установить и активизировать службу.

Параграф 1. Создание проекта службы

В меню File VS .NET выбераем New и Project. В диалоговом окне New Project Project Types выбираем Visual C# Projects, Template — Windows Service, задаем Name, например, MyFirstServicee, Location — определяем директорию, где будем формировать проект.

После нажатия кнопки OK проект решения Service будет создан. Cозданные файлы проекта несколько отличны от тех, что были в Visual Studio 2003. Их имена (см. Рис.1. и директорию проекта):
— Имя_Проекта.sln,
— Имя_Проекта.csproj,
— Servece1.Designer.cs,
— Service1.cs,
— Service1.resx.

Файл AssemblyInfo.cs «переехал» в папку Properties.

Рис.1. Создание проекта решения службы

На данном этапе нас интересует файл с именем Service1.cs. Service — имя класса проекта, наследника класса System.ServiceProcess.ServiceBase.

Класс содержит конструктор класса, функцию main и функции методов OnStart и OnStop. Методы OnPause (), и OnContinue () также могут быть включены в проект (их код может быть дописан вручную, но методы не являются обязательными).

Код инициализации компонент в Visual Studio 2005 перемещен в файл Servece1.Designer.cs, как и метод Dispose:

В контекстном меню дизайнера формы (вкладка проекта Service1.cs [Design], правый клик мышки) выбираем пункт Properties (если вкладка не видна — дважды кликнем мышкой по имени файла Servece1.cs в Solutation Explorer). Устанавливаем свойства(Рис.2.):
— ServiceName (имя проекта) — MyFirstService,
— AutoLog — True.

Рис.2. Установка свойств сервиса

Здесь можно изменить и отображаемое имя сервиса (свойство ServiceName).

Читайте также:  Активатор windows 10 энтерпрайз

На этом проект решения сервиса создан.

Параграф 2. Написание функционального кода сервиса

Для того, чтобы убедиться в работоспособности нашего сервиса, возложим на него задачу писать в некоторый лог файл какую либо информацию при старте и останове. Для этого:

Добавим пространство имен:

Объявим в классе Service1 StreamWriter:

Коды обработчиков событий запишем следующим образом:

Позже мы добавим нашему сервису другую функциональность.

Параграф 3. Создание установщиков для службы

На вкладке Service1.cs [Design] вызываем вновь контекстное меню и пункт Add Instaler. В проект добавляется класс компонента, содержащий два установщика:
— ProjectInstaller — для установки службы и
— ServiceInstaller — для установки связанного со службой процесса.

Для ServiceInstaller1 отображаем его свойства (контекстное меню Properties) и задаем:
— ServiceName — MyFirstService,
— ServerType — Automatic.

Для ServiceProcessInstaller1 устанавливаем значение Account в LocalSystem (Рис.3.).

Рис.3. Создание установщика для службы

Параграф 4. Создание исполняемого файла для службы

В Solution Explorer выбираем пункт Properties для узла MyFirstServices. В диалоговом окне выбираем вкладку Application. Для пункта Startup object выбираем в выпадающем списке MyFirstService.Programm (Рис.4.).

Рис.4. Установка свойств для программы установки

В контекстном меню для узла MyFirstServices выбираем пункт Build. После этого, проект построен и в директории проекта obj\debug или obj\release будет сформирован файл MyFirstService.exe. Однако, попытка его запуска приведет к выдаче сообщения (Рис.5.):

Рис.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\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.

Читайте также:  Kms activator windows 10 что это такое

Параграф 6. Установка, активизация и удаление службы

Для установки службы в Solutation Explorer выбираем проект установки (FirstServices) и в контекстном меню пункт Install. В результате, будет запущен Setup Wizard. На втором шаге его работы зададим системную папку Windows — C:\WINDOWS\system32\. После окончания работы Setup Wizard служба будет установлена.

Чтобы запустить и остановить службу откроем диспетчер управления службами (в Windows XP — Start/Programm/Administrative Tools/Services). Имя нашей службы MyFirstService будет отображено в окне Services, и можно обычным образом запустить наш сервис через контекстное меню пункт Start (кроме того, служба автоматически будет запускаться при перегрузке компьютера).

Наш сервис (служба) создал файл Service1.log в «C:\windows\System32\ и выполнил в него запись о своем старте. При останове сервиса запись будет выполнена вновь.

Службу можно устанавливать и удалять, используя файлы setup.exe и FirstServices.msi, которые после построения установщика находятся в каталоге, где был создан проект инсталлятора В данном примере в C:\. \FirstService\Debug\ и, кроме того, этих двух файлов достаточно для установки службы из любой директории любого компьютера.

На данном этапе мы выполнили все требуемые шаги и проверили нашу службу в работе. Далее, можно выполнить построение проекта в режиме Release (меню Build, Configuration Manager, Release). setup.exe и FirstServices.msi, после построения установщика будут находятся в каталоге C:\. \FirstServices\bin\Release). Далее возможно наполнять функциональность службы по своему усмотрению.

Удаления сервиса с компьютера выполняется как и обычного приложения Windows — (Settings/Control Panel/Add on Remove Programs).

Параграф 7. Пример использования службы, для периодического выполнения некоторых действий

Для задания простого механизма опроса можно воспользоваться компонентом System.Timers.Timer. В методе OnStart можно задать параметры компонента. Таймер будет выполнять в коде периодически некоторые действия (например, запись в файл текущего времени, как это показано ниже). В код лишь добавлен компонент Timer и обработчик события, выполняющий некоторые действия по истечении заданного свойством timer1.Interval времени.

Содержимое файла Service1.log:

Молчанов Владислав 21.06.2005г.

Адаптировано к VS 2005 16.04.2008г.

Проверено в VS 2010 8.09.2011г.

Службы Windows

Создание службы для Windows

Одним из важнейших компонентов ОС Windows являются службы. Фактически это отдельные приложения, которые не имеют графического интерфейса и которые выполняют различные задачи в фоновом режиме. Службы могут быть запущены при старте операционной системы, так и в любой другой момент работы пользователя. Распространенным примером служб являются различные веб-серверы, которые в фоновом режиме прослушивают определенный порт на наличие подключений, и если подключения имеются, то взаимодействуют с ними. Это могут быть также различные вспомогательные сервисы обновлений для других установленных программ, которые обращаются к серверу, чтобы узнать, есть ли новая версия приложения. В общем то мы можем открыть панель служб и сами увидеть все установленные и запущенные службы:

Рассмотрим, как создавать свои службы в C#. В качестве реализуемой задачи выберем наблюдение за изменениями в определенной папке в файловой системе. Теперь создадим для ее выполнения службу.

Вначале создадим новый проект, который будет иметь тип Windows Service . Назовем проект FileWatcherService:

После этого Visual Studio генерирует проект, который имеет все необходимое. Хотя в принципе нам необязательно выбирать именно этот тип проекта, можно было бы создать проект библиотеки классов, и затем в нем определить все необходимые классы.

Читайте также:  Зарезервировать windows 10 pro

Итак, новый проект выглядит следующим образом:

Здесь также есть файл Program.cs и есть собственно узел службы Service1.cs .

Служба представляет обычное приложение, но она не запускаетс сама по себе. Все вызовы и обращения к ней проходят через менеджер управления службами (Service Control Manager или SCM). Когда служба запускается автоматически при старте системы или вручную, то SCM обращается к методу Main в классе Program:

Метод Main по умолчанию определен таким образом, чтобы запускать сразу несколько служб, которые определены в массиве ServicesToRun. Однако по умолчанию проект содержит только одну службу Service1. Сам запуск производится с помощью метода Run: ServiceBase.Run(ServicesToRun) .

Сама запускаемая служба представлена узлом Service1.cs. Однако на самом деле это не простой файл кода. Если мы откроем этот узел, то увидим в нем файл дизайнера службы Service1.Designer.cs и класс Service1.

Класс Service1 собственно представляет службу. По умолчанию он имеет следующий код:

Класс службы должен наследоваться от базового класса ServiceBase . Этот класс определяет ряд методов, важнейшие из которых метод OnStart() , который запускает действия, выпоняемые службой, и метод OnStop() , останавливающий службу.

После того, как SCM вызовет метод Main и зарегистрирует службу, происходит непосредственный ее вызов через запуск метода OnStart.

Когда в консоли служб или через командную строку мы посылаем команду на остановку службы, то SCM обращается к методу OnStop для ее остановки.

Кроме этих двух методов в классе службы можно переопределить еще несколько методов базового класса ServiceBase:

OnPause : вызывается при приостановке службы

OnContinue : вызывается при возобновлении работы службы после ее приостановки

OnShutdown : вызывается при завершении работы Windows

OnPowerEvent : вызывается при изменении режима электропитания

OnCustomCommand : вызывается при получении службой пользовательской команды от Менеджера Управления Службами (Service Control Manager / SCM)

В конструкторе класса Service1 вызывается метод InitializeComponent() , который определен в файле дизайнера Service1.Designer.cs:

Единственное, что надо в нем отметить, это установка названия службы (свойство ServiceName):

Это то название, которое будет отображаться в консоли служб после установки данной службы. Мы можем его изменить, а можем и оставить как есть.

Теперь изменим код службы следующим образом:

Ключевым классом, который инкапсулирует всю функциональность, является класс Logger. С помощью объекта FileSystemWatcher он будет вести мониторинг изменений в папке D://Temp. В методе Start() устанавливается, что мы будем отслеживать изменения через объект FileSystemWatcher. И вся работа будет идти, пока булевая переменная enabled равна true . А метод Stop() позволит завершить работу класса.

События FileSystemWatcher позволяют отслеживать все изменения в наблюдаемой папке. При этом будет вестись запись изменений в файл templog.txt. Чтобы не было гонки ресурсов за файл templog.txt, в который вносятся записи об изменениях, процедура записи блокируется заглушкой lock(obj) .

В итоге после создания, изменения, переименования и удаления файл лога будет содержать что-то наподобие:

В самом классе службы Service1 в конструкторе устанавливается ряд опций:

В методе OnStart() для запуска объекта Logger вызывется новый поток:

Новый поток нужен, так как текущий поток обрабатывает только команды SCM и должен возвращаться из метода OnStart как можно быстрее.

Когда от менеджера SCM поступает команда на остановку службы, срабатывает метод OnStop, который вызывает метод logger.Stop() . Дополнительная задержка позволит потоку логгера остановиться:

Однако самого класса службы еще недостаточно. Нам необходимо еще создать устанощик службы.

Оцените статью