Меню Рубрики

Create windows service net

Службы Windows

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

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

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

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

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

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

Здесь также есть файл 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() . Дополнительная задержка позволит потоку логгера остановиться:

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

Источник

Разработка приложений службы Windows Develop Windows service apps

С помощью Visual Studio или пакета SDK для .NET Framework можно легко создавать службы. Просто создайте приложение, которое устанавливается как служба. Using Visual Studio or the .NET Framework SDK, you can easily create services by creating an application that is installed as a service. Такие приложения называются службами Windows. This type of application is called a Windows service. Используя компоненты платформы, можно создавать, устанавливать, запускать, останавливать и администрировать службы. With framework features, you can create services, install them, and start, stop, and otherwise control their behavior.

В Visual Studio можно создать службы с помощью управляемого кода на Visual C# или Visual Basic, который при необходимости может взаимодействовать с существующим кодом C++. In Visual Studio you can create a service in managed code in Visual C# or Visual Basic, which can interoperate with existing C++ code if required. Или можно создать службу Windows на машинном языке C++ с помощью мастера проектов ATL. Or, you can create a Windows service in native C++ by using the ATL Project Wizard.

Содержание раздела In this section

Сведения о приложениях служб Windows, времени существования служб и отличиях приложений служб от распространенных типов проектов. Provides an overview of Windows service applications, the lifetime of a service, and how service applications differ from other common project types.

Пример создания службы на Visual Basic и Visual C#. Provides an example of creating a service in Visual Basic and Visual C#.

Описание элементов языка, используемых при создании служб. Explains the language elements used in service programming.

Создание и настройка служб Windows с помощью шаблона проекта службы Windows. Describes the process of creating and configuring Windows services using the Windows service project template.

Связанные разделы Related sections

ServiceBase — описываются основные характеристики класса ServiceBase, который используется для создания служб. ServiceBase — Describes the major features of the ServiceBase class, which is used to create services.

ServiceProcessInstaller — описываются возможности класса ServiceProcessInstaller, который используется вместе с классом ServiceInstaller для установки и удаления службы. ServiceProcessInstaller — Describes the features of the ServiceProcessInstaller class, which is used along with the ServiceInstaller class to install and uninstall your services.

ServiceInstaller — описываются возможности класса ServiceInstaller, который используется вместе с классом ServiceProcessInstaller для установки и удаления службы. ServiceInstaller — Describes the features of the ServiceInstaller class, which is used along with the ServiceProcessInstaller class to install and uninstall your service.

Create Projects from Templates (Создание проектов на основе шаблонов) — описываются типы проектов, которые используются в этом разделе, и способ их выбора. Create Projects from Templates — Describes the projects types used in this chapter and how to choose between them.

Источник

.NET Core Workers как службы Windows

В .NET Core 3.0 мы представляем новый тип шаблона приложения под названием Worker Service. Этот шаблон предназначен для того, чтобы дать вам отправную точку для написания долго-работающих сервисов в .NET Core. В этом пошаговом руководстве мы создадим worker и запустим его в качестве службы Windows.

Создание worker

Примечание. В наших предварительных версиях шаблон worker находится в том же меню, что и веб-шаблоны. Это изменится в будущем выпуске. Мы намерены разместить шаблон Worker Service непосредственно в мастере создания нового проекта.

Создание Worker в Visual Studio

Создание Worker в командной строке

Выполните dotnet new worker

Запуск в виде службы Windows

Чтобы запустить в качестве службы Windows, нам нужно, чтобы наш worker видел сигналы запуска и остановки от типа ServiceBase .NET, который связывает системы Windows Service с приложениями .NET. Для этого нужно:

Добавить пакет NuGet Microsoft.Extensions.Hosting.WindowsServices

Добавить вызов UseServiceBaseLifetime к HostBuilder в Program.cs

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

Во-вторых, он настраивает ваш хост на использование ServiceBaseLifetime . ServiceBaseLifetime работает с ServiceBase чтобы помочь контролировать время жизни вашего приложения при запуске в качестве службы Windows. Это переопределяет стандартный ConsoleLifetime который обрабатывает такие сигналы, как CTL + C.

Установка Worker

Как только мы получили worker использовав ServiceBaseLifetime нам нужно установить его:

Во-первых, давайте опубликуем приложение. Мы установим Службу Windows in-place, что означает, что исполняемый файл будет заблокирован при каждом запуске службы. Публикация — это хороший способ убедиться, что все файлы, необходимые для запуска службы, находятся в одном месте и готовы к установке.

Далее можно использовать sc utility в командной строке администратора

Примечание о безопасности: Эта команда запускает службу как локальную систему, которая не является тем, что нужно. Вместо этого вы должны создать service account и запустить службу Windows в качестве этой учетной записи. Мы не будем говорить об этом здесь, но здесь есть некоторая документация по ASP.NET: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-2.2

Логирование

У системы логирования есть сервис «Event Log», который может отправлять сообщения логов непосредственно в журнал событий Windows. Чтобы войти в журнал событий, вы можете добавить Microsoft.Extensions.Logging.EventLog пакет, а затем изменить ваш Program.cs :

Дальнейшая работа

В следующих предварительных версиях мы планируем улучшить использование Workers с Windows Services:

  1. Переименуем UseWindowsServiceBaseLifetime на UseWindowsService
  2. Добавим автоматическую и улучшенную интеграцию с журналом событий при запуске в качестве службы Windows.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Create windows 10 setup
  • Create vpn on windows
  • Create usb bootable windows from iso
  • Create uefi bootable usb windows 10
  • Create symbolic link windows 7