Знакомство с приложениями служб Windows
Службы Microsoft Windows, ранее называвшиеся службами NT, позволяют создавать исполняемые приложения, работающие продолжительное время и выполняющиеся в отдельной сессии Windows. Эти службы не содержат элементов пользовательского интерфейса, могут быть остановлены и запущены повторно и способны автоматически запускаться при загрузке компьютера. Эти особенности делают службы идеальным средством для использования на сервере, а также в ситуациях, когда необходима долговременно работающая функциональность, не мешающая работе пользователей на том же компьютере. Кроме того, службы могут запускаться в контексте безопасности конкретной учетной записи Windows, отличающейся от текущего пользователя или учетной записи компьютера по умолчанию. Дополнительные сведения о службах и сеансах Windows см. в документации Platform SDK в библиотеке MSDN.
Примечание
Шаблон "Служба Windows" и связанные с ним функциональные возможности недоступны в выпуске Visual Studio Standard Edition.
Службы можно легко создавать путем создания приложений, которые устанавливаются в качестве служб. Предположим, что нужно отслеживать данные счетчика производительности и реагировать на пороговые значения. Можно написать приложение службы Windows, которое будет считывать эти показания, развернуть приложение и приступить к сбору и анализу данных.
Служба создается как проект Microsoft Visual Studio; в проект помещается код, определяющий, какие команды могут быть посланы службе, и действия, которые должны быть выполнены в ответ на эти команды. Службе могут быть посланы команды запуска, остановки, приостановки и возобновления выполнения; также возможно выполнение настраиваемых команд.
После создания и построения приложения для его установки необходимо запустить программу командной строки InstallUtil.exe, указав ей путь к исполняемому файлу службы, или же использовать средства развертывания Visual Studio. В дальнейшем для настройки, запуска, остановки или приостановки этой службы можно использовать Диспетчер управления службами. Часть этих действий может быть также выполнена через узел Службы в обозревателе серверов или с помощью класса ServiceController.
Приложения-службы илидругие приложения Visual Studio
Работа приложений служб имеет ряд отличий от других типов проектов.
Чтобы проект начал работать, исполняемый файл, созданный после компиляции проекта приложения службы, должен быть предварительно размещен на сервере. Приложения служб нельзя отлаживать или запускать нажатием клавиш F5 или F11; также нельзя производить непосредственный запуск службы или пошаговую отладку ее кода. Вместо этого необходимо установить и запустить службу, а затем использовать для отладки процесса данной службы отладчик. Дополнительные сведения см. в разделе Практическое руководство. Отладка приложений служб Windows.
В отличие от проектов других типов, для приложений служб обязательно нужно создавать компоненты установки. Компоненты установки устанавливают и регистрируют службу на сервере, а также используют Диспетчер управления службами Windows для создания соответствующей записи об этой службе. Дополнительные сведения см. в разделе Практическое руководство. Добавление установщиков в приложение служб.
Метод Main приложения службы должен послать команду запуска службам, входящим в состав проекта. Метод Run загружает службы в Диспетчер управления службами соответствующего сервера. При использовании шаблона проекта Служба Windows данный метод создается автоматически. Необходимо помнить, что загрузка службы — не то же самое, что ее запуск. Дополнительные сведения см. далее в разделе "Жизненный цикл службы".
Приложения служб Windows выполняются в отдельной оконной станции, отличной от станции вошедшего пользователя. Оконная станция — это безопасный объект, содержащий буфер обмена, набор глобальных атомов и группу объектов рабочего стола. Поскольку оконная станция службы Windows не является интерактивной, диалоговые окна, создаваемые службой Windows, не будут отображаться и могут привести к зависанию программы. Аналогичным образом, сообщения об ошибках должны записываться в журнал событий Windows, а не выводиться на экран.
Классы служб Windows, поддерживаемые .NET Framework, не поддерживают взаимодействие с интерактивными станциями, то есть станциями текущего пользователя. В NET Framework также отсутствуют классы, представляющие станции и рабочие столы. При необходимости организовать взаимодействие службы Windows с другими станциями следует использовать неуправляемый интерфейс API Windows. Дополнительные сведения см. в документации Platform SDK.
Взаимодействие службы Windows с пользователем или другими станциями должно быть тщательно спроектировано с учетом таких ситуаций, как отсутствие текущего пользователя или непредвиденный набор объектов рабочего стола пользователя. В некоторых случаях более целесообразным будет создание приложения Windows, выполняющегося под управлением пользователя.
Приложения служб Windows выполняются в собственном контексте безопасности и запускаются до того, как пользователь войдет в систему на компьютере, на котором они установлены. Необходимо с осторожностью подходить к вопросу выбора учетной записи, от имени которой будет запускаться служба; службы, запущенные от имени системной учетной записи, имеют больше прав и привилегий, чем службы, запущенные от имени учетной записи пользователя.
Жизненный цикл службы
Жизненный цикл службы включает несколько состояний. Сначала служба устанавливается на компьютер, на котором она будет работать. При этом для проекта службы запускаются установщики, а сама служба устанавливается в Диспетчер управлениями службами этого компьютера. Диспетчер управлениями службами является основным средством управления службами Windows.
После загрузки службы ее необходимо запустить. После запуска служба может выполнять свои задачи. Служба может быть запущена с помощью Диспетчера управлениями службами, с помощью обозревателя серверов или же путем вызова метода Start. Метод Start передает управление методу OnStart вызываемого приложения и выполняет содержащийся в нем код.
Служба может находиться в запущенном состоянии неограниченное время, пока она не будет остановлена или приостановлена, или же пока компьютер не будет выключен. Существуют три основных состояния службы: Running, Paused или Stopped. Кроме того, служба может сообщать о состоянии ожидания выполнения команды: ContinuePending, PausePending, StartPending, или StopPending. Это говорит о том, что выполняется отправленная службе команда (например, команда приостановки или запуска службы). Определить, в каком состоянии находится служба, можно с помощью свойства Status; метод WaitForStatus используется для выполнения какого-либо действия при возникновении какого-либо из этих состояний.
Служба может быть приостановлена, остановлена или продолжена с помощью Диспетчера управления службами, обозревателя серверов или же путем вызова соответствующих программных методов. При каждом из этих действий может вызываться соответствующая процедура службы (OnStop, OnPause или OnContinue), где можно задать дополнительные действия при изменении состояния службы.
Типы служб
С помощью .NET Framework в Visual Studio можно создавать службы двух типов. Если служба в процессе одна, то она относится к типу Win32OwnProcess. Службы, находящиеся в процессе совместно с другими службами, относятся к типу Win32ShareProcess. Получить тип службы можно с помощью свойства ServiceType.
При попытке считать значение этого свойства у служб, которые были созданы вне Visual Studio, могут быть получены и другие значения. Дополнительные сведения см. в разделе ServiceType.
Службы и компонент ServiceController
Компонент ServiceController используется для подключения к установленной службе и изменения ее состояния. С помощью компонента ServiceController можно запустить или остановить службу, приостановить ее или продолжить выполнение, а также отправить службе настраиваемую команду. Однако при создании приложения службы нет необходимости в использовании компонента ServiceController. Фактически в большинстве случаев компонент ServiceController должен находиться не в самом приложении службы Windows, а в отдельном приложении.
Дополнительные сведения см. в разделе ServiceController.
Развертывание и установка служб
В состав Visual Studio входят компоненты установки, предназначенные для установки ресурсов, связанных с приложениями служб. Компоненты установки регистрируются в системе, в которой они устанавливаются, в качестве отдельной службы; после этого они дают знать о своем присутствии Диспетчеру управления службами.
Следующим (после добавления установщиков) шагом является создание проекта установки, который устанавливает откомпилированные файлы проекта и запускает установщики, необходимые для установки службы. Для создания полного проекта установки в него необходимо сначала добавить выходной файл проекта приложения службы, а затем требуемое для установки службы настраиваемое действие. Дополнительные сведения о проектах установки см. в разделе Проекты установки и развертывания. Дополнительные сведения о настраиваемых действиях см. в разделе Пошаговое руководство. Создание настраиваемого действия.
Требования
Службы должны создаваться с использованием проекта приложения Служба Windows или другого типа проекта .NET Framework, который наследует от класса ServiceBase и при построении которого будет создан EXE-файл.
В состав проектов, содержащих службы Windows, должны входить компоненты установки самого проекта и его служб. Для этого можно использовать настройки, задаваемые в окне Свойства. Дополнительные сведения см. в разделе Практическое руководство. Добавление установщиков в приложение служб.
См. также
Задачи
Практическое руководство. Создание служб Windows
Практическое руководство. Установка и удаление служб
Практическое руководство. Запуск служб
Практическое руководство. Отладка приложений служб Windows
Пошаговое руководство. Создание приложения служб Windows в конструкторе компонентов
Практическое руководство. Добавление установщиков в приложение служб
Пошаговое руководство. Создание настраиваемого действия
Основные понятия
Программная архитектура приложений служб
Проекты установки и развертывания