C windows service library

Создание на C# службы Windows в Visual Studio 2015

Хочу описать процесс создание и тестирования службы Windows на C#. В качестве среды разработки буду использовать Visual Studio 2015. В качестве примера создам службу, которая пишет в файл данные о событиях. Исходный код проекта доступен на GitHub.

Для создания службы я создаю решение с тремя проектами:

Приложение Windows Forms

Создание новой службы начинается, с создания windows приложения (шаблон проекта «Приложение Windows Forms»). Оно нам понадобится для тестирования службы. Приложение будет состоять из одной формы:

Разработка логики

На втором этапе создается проект «Библиотека классов». Именно здесь создаются классы описывающие логику работы будущей службы. Выделение логики в библиотеку классов позволяют нам пока не думать о реализации службы, а вести разработка стандартной windows программы. Плюсом такого подхода является: простота тестирования, легкость повторного использования кода, возможность создания автоматических тестов. В данном примере в библиотеке классов мы создадим только один класс:

Для тестирования — используем приложение созданное на первом этапе.

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

Когда логика новой службы написана и оттестирована, приступаем к созданию службы. В качестве шаблона используем стандартный шаблон: «Служба Windows». Реализация службы должна выглядеть примерно так:

Не забываем вставлять ссылку на библиотеку классов. Настраиваем установку службы.

Тестирование службы

Для финального тестирования возвращаемся к приложению Windows Form. Добавляем в него ссылку на созданную службу и создаем новый класс производный от класса описывающего созданную службу:

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

После тестирования — можно разворачивать нашу службу.

Особенности служб Windows

Написав свою первую службу по работе с БД, столкнулся с загадочной ошибкой. При тестировании все работало замечательно, но периодически, при перезагрузке компьютера, служба не стартовала. Оказалось, что если сервер БД не успевал запуститься к моменту старта моей службы — возникала ошибка. Поэтому, когда пишите службу, необходимо понимать, какие приложения вы используете и будут ли они доступны в момент запуска службы

Ссылки

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.

Создаем службу (сервис) на C#

Приветствую всех сегодня рассмотрим тему касающуюся создание служб на C# под Windows.

Службы Microsoft Windows (NT-Services) – это процессы, выполняющиеся в фоновом режиме, не имеющие пользовательского интерфейса и работающие в отдельном сеансе. Службы могут запускаться автоматически при загрузке компьютера, даже если пользователь не вошел в систему.

Для мониторинга и управления службами Windows можно применять доступную в консоли ММС оснастку Services (Службы), которая находится в узле Computer Management (Управление компьютером).

Запустить Службу компонентов, можно выбрать Пуск>Средства администрирования>Служба компонентов

Перед вами запуститься консоль управлением службами установленными у вас системе:

Службу компонентов можно так же запустить другим способом, открыть консоль win+r и ввести services.msc

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

Для этого запустите Visual Studio выберите Фаил>Создать проект>Служба Windows

Читайте также:  Windows 10 custom theme

В этом примере я покажу как программно создать службу без использования конструктора:

После запуска проекта, переходим в код программы, в моем случаи он выглядит так:

Обратите внимание, мы работаем в файле Service1.cs наследуемый от System.ServiceProcess.ServiceBase. а не в Program.cs

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

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

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

Основной класс у нас готов, теперь нужно создать класс установщик. Так как п еред запуском службы Windows ее необходимо установить при этом служба будет зарегистрирована с помощью диспетчера управления службами. В проект можно добавить установщики, которые обрабатывают сведения о регистрации.

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

Настройки произвел в конструкторе студии таким образом:

Перейдем к коду этого класса, в нем я так же рассмотрел способ того как можно программно включить опцию :

Вход в систему: С системой учетной записью и установил программно галочку Разрешить взаимодействие с рабочим столом. Хотя судя из документации говориться что это сделать не возможно. Но я так понял что данная возможность была упразднена и в windows 10 от нее толку нет.

Раньше данная опция позволяла взаимодействовать с пользователем, делать скриншот экрана, и даже перехватывать нажатие клавиш.

Создание служб Windows с помощью C#

Служба Windows – это специальная служебная программа, которая запускается операционной системой автоматически при загрузке вне зависимости от статуса пользователя или вручную (в зависимости от настроек).

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

Также, в отличие от «обычных» программ, службы не имеют графического интерфейса и управляются при помощи специального диспетчера.

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

В этой статье мы рассмотрим пример создания службы Windows с использованием языка программирования C#.

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

Для того, чтобы создать проект службы необходимо в окне создания нового проекта выбрать пункт «Служба Windows ».

После этого Visual Studio создаст новый проект с «каркасом» службы.

К сожалению, в отличие, например, от Windows Forms или консольного приложения данный «каркас» не самодостаточен. То есть, установить в систему и запустить в работу такую «пустую» службу нельзя. Необходимо дописать рабочий функционал и логику установки в систему.

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

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

Ниже представлен такой класс для нашей службы.

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

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

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

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

Читайте также:  One click fix windows update

Для создания службы в 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).

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

Параграф 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.).

Читайте также:  Установка сканера linux mint

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

Параграф 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г.

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