Статьи

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

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

Чтобы создать службу Windows, запустите Visual Studio, выберите раздел проектов Visual C # и выберите службу Windows в качестве типа проекта:

После создания вы увидите, что нет дизайнера. Чтобы перейти к коду, нажмите F7, и вы должны увидеть структуру кода, подобную этой:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Diagnostics;using System.Linq;using System.ServiceProcess;using System.Text;namespace testService{    public partial class Service1 : ServiceBase    {        public Service1()        {            InitializeComponent();        }        protected override void OnStart(string[] args)        {        }        protected override void OnStop()        {        }    }}

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

string openString = DateTime.Now.ToString() + " | Service Started";string path = @"D:\Temporary\log.txt";List<string> processes = new List<string>();foreach (Process process in Process.GetProcesses()){    processes.Add(process.ProcessName);}if (File.Exists(path)){    using (StreamWriter writer = File.AppendText(path))    {        writer.WriteLine(openString);        foreach (string item in processes)            writer.WriteLine(item);        writer.Close();    }}else{    File.WriteAllText(path, openString);    using (StreamWriter writer = File.AppendText(path))    {        foreach (string item in processes)            writer.WriteLine(item);        writer.Close();    }}

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

Когда служба останавливается, рекомендуется также добавить запись в журнал. Итак, вот фрагмент кода для обработчика события OnStop :

string stopString = DateTime.Now.ToString() + " | Service Stopped";using (StreamWriter writer = File.AppendText(@"D:\Temporary\log.txt")){    writer.WriteLine(stopString);    writer.Close();}

Помимо обработчиков событий OnStop и OnStart , разработчик также может работать с OnPause и OnContinue .

Давайте немного настроим сервис. Вернитесь на начальную страницу без дизайнера. Там в правом нижнем углу вы увидите список доступных свойств:

Вместо имени по умолчанию ( Service1 ) я назвал его TestService , так что позже я могу легко определить его в списке служб.

Фактическое обслуживание не может быть установлено на локальном компьютере без установщика. Чтобы добавить установщик, щелкните правой кнопкой мыши серый фон в представлении без дизайнера и выберите параметр «Добавить установщик».

Теперь вы должны увидеть установщик в списке:

Выберите установщик процесса службы (в данном случае — serviceProcessInstaller1 ) и измените свойство Account на LocalService (в противном случае будет использоваться аутентификация):

ПРИМЕЧАНИЕ. Если вы проводите тестирование в Windows Vista или Windows 7, вы можете установить этот параметр на LocalSystem, чтобы избежать ошибки «Отказано в доступе».

Чтобы протестировать приведенный выше код, мне нужно установить сервис, поскольку я не могу протестировать его непосредственно из IDE. Нажмите Ctrl + Shift + B, чтобы построить решение. После успешного завершения сборки перейдите в папку, содержащую только что скомпилированный исполняемый файл.

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

C: \ Users \ Dennis \ Documents \ Visual Studio 2010 \ Projects \ testService \ testService \ bin \ Debug

Там я вижу исполняемый файл testService.exe. Это именно то, что я искал. Теперь запустите командную строку Visual Studio (в меню Пуск -> Программы -> Microsoft Visual Studio -> Инструменты Visual Studio ). Отсюда я собираюсь использовать INSTALLUTIL для установки службы на локальном компьютере с Windows. Для этого введите следующее:

installutil <путь к исполняемому файлу>

Как только вы нажмете ENTER, вы должны увидеть что-то вроде этого:

Когда вы увидите сообщение о том, что служба успешно установлена, нажмите Win + R на клавиатуре, чтобы открыть диалоговое окно «Выполнить», и введите services.msc — откроется список служб, установленных на текущем компьютере.

Там вы можете увидеть недавно установленный сервис:

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

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

installutil <путь к исполняемому файлу> / u