пятница, 22 ноября 2013 г.

Пишем свой Windows service

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

Самым верным решением в данной ситуации является написание Windows сервиса.

Пример создания сервиса в Studio 2010, .Net C# под катом

Шаг 1. Создание проекта.



Создайте новый проект, выбрав шаблон Windows Service



Переименуйте класс сервиса как вам нужно.



Получили такой вод код:

namespace ExampleSrv
{
  public partial class MyService : ServiceBase
  {
    public MyService()
    {
      InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
    }

    protected override void OnStop()
    {
    }
  }
}


* This source code was highlighted with Source Code Highlighter.


Это и есть, собственно, сам сервис.
Используйте OnStart и OnStop события для реализации своей поставленной задачи.

Шаг 2. Добавление установщика.


Чтобы ваш сервис заставить работать, его нужно установить.
Чтобы его установить, он должен иметь установщик.

Клик правой кнопкой… Add installer



Теперь у нас есть serviceProcessInstaller и serviceInstaller

img04

В первом можете поставить значение Account в LocalSystem.
Во втором укажите имя сервиса, описание и не забудьте поставить StartType — Automatic.



Установщик готов.

Шаг 3. Логирование.


Для того чтобы вы смогли узнать что делал ваш сервис, когда он стартовал, завершался или что-нибудь еще, вы можете использовать системное логирование. 
Делается это очень легко.
Перетаскиваете из Toolbox в свой сервис EventLog.



Примерно так делается логирование:

public partial class MyService : ServiceBase
  {
    public MyService()
    {
      InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
      AddLog("start");
    }

    protected override void OnStop()
    {
      AddLog("stop");
    }

    public void AddLog(string log)
    {
      try
      {
        if (!EventLog.SourceExists("MyExampleService"))
        {
          EventLog.CreateEventSource("MyExampleService""MyExampleService");
        }
        eventLog1.Source = "MyExampleService";
        eventLog1.WriteEntry(log);
      }
      catch{}
    }
  }


* This source code was highlighted with Source Code Highlighter.


Шаг 4. Установка.


Чтобы установить сервис, нужно вызвать утилиту установки и передать параметром путь к своему сервису.
Для этого я создал install.bat такого вида:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe D:\...\ExampleSrv\bin\Debug\ExampleSrv.exe
pause


Если вы выбрали в serviceProcessInstaller значением поля Account — User, то при установке вы должны будете ввести логин и пароль учетной записи, под которой будет запускаться сервис. Внимание! Писать домен перед именем пользователя обязательно!

Запускаем батник обязательно с правами администратора и наблюдаем в конце:

The Commit phase completed successfully.
The transacted install has completed.


Это значит что сервис установлен.
Проверяем:



Установился.


Пару раз делаем запуск и остановку. Смотрим логи:



Видим когда сервис запускался и останавливался.


Наш сервис готов.


Материал частично взят от сюда: 
msdn.microsoft.com/en-us/library/zt39148a(VS.80).aspx

Комментариев нет: