В отличие от стандартных приложений 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 — откроется список служб, установленных на текущем компьютере.
Там вы можете увидеть недавно установленный сервис:
Запуск настроен на Вручную, поэтому вы можете щелкнуть по нему правой кнопкой мыши и запустить службу. После запуска перейдите в папку, указанную для файла журнала, и посмотрите, есть ли запись в журнале.
Если вам больше не нужен сервис или вы хотите протестировать другую сборку, используйте эту команду для удаления сервиса: