Отладка Windows Service приложений не такая тривиальная задача как кажется. Проблема в том, что при отладке этого типа приложений нельзя воспользоваться стандартными средствами Visual Studio такими как точки останова (breakpoints) и прочими полезными инструментами. Всё из-за того, что Windows Service приложение не может быть зыпущено по F5 прямо из Visual Studio. Всё же, MSDN предлагает нам несколько способов для их отладки. Скорее всего многие разработчики даже и не сталкивались с ними до тех пор, пока не стали создавать свою первую службу. Это использование записей в журнал событий и подключение к процессу. Оба этих метода хорошо описаны в MSDN, но они позволяют произовдить отладку только уже запущенной службы. Из-за этого код, который производит сам запуск службы, в методе OnStart(), нельзя протестировать.
Ниже я хочу рассказать о способе которым можно обойти это ограничение, и тестировать свой сервис как обычное консольное приложение. И, следовательно, воспользоваться всем тем, что предлагает нам для этого Visual Studio.
Сначала нам нужно создать новый проект. Назовем его TestWinService.
Т.к. это служба, сразу же добавим к нему установищик. Нажимаем правой клавишей мыши на пустой области только что открывшегося файла и выбираем Add Installer.
Теперь добавим к нашему решению консольный проект, из которого мы, собственно, и будем производить отладку нашей службы. Сразу после создания нового проекта добавим к нему две ссылки. Одна на нашу службу, TestWinService, другая на System.ServiceProcess необходимую для вызова сервиса.
Теперь начинается самое интересное. Чтобы отладить код запускающий службу, нам нужно будет создать новый поток, который и будет делать всю необходимую работу. А также два метода – Start() и Stop() для его запуска и завершения. И, соответственно, вызовем их в методах включения и выключения службы. В итоге у нас получится что-то вроде этого.
Видно, что мы добавили тестовую строку и поставили на нее точку останова.
Теперь добавим в консольное приложение код, который будет эмулировать запуск и остановку службы. У нас должно получиться, что-то подобное на рисинке ниже.
Все готово! Остается только нажать F5 и убедиться, что отладчик остановился на тестовой строке.
С помощью этого метода отладка служб становится ничем не труднее отладки обычного консольного приложения. Надеюсь это кому-нибудь пригодиться.
Ниже я хочу рассказать о способе которым можно обойти это ограничение, и тестировать свой сервис как обычное консольное приложение. И, следовательно, воспользоваться всем тем, что предлагает нам для этого Visual Studio.
Сначала нам нужно создать новый проект. Назовем его TestWinService.
Т.к. это служба, сразу же добавим к нему установищик. Нажимаем правой клавишей мыши на пустой области только что открывшегося файла и выбираем Add Installer.
Теперь добавим к нашему решению консольный проект, из которого мы, собственно, и будем производить отладку нашей службы. Сразу после создания нового проекта добавим к нему две ссылки. Одна на нашу службу, TestWinService, другая на System.ServiceProcess необходимую для вызова сервиса.
Теперь начинается самое интересное. Чтобы отладить код запускающий службу, нам нужно будет создать новый поток, который и будет делать всю необходимую работу. А также два метода – Start() и Stop() для его запуска и завершения. И, соответственно, вызовем их в методах включения и выключения службы. В итоге у нас получится что-то вроде этого.
Видно, что мы добавили тестовую строку и поставили на нее точку останова.
Теперь добавим в консольное приложение код, который будет эмулировать запуск и остановку службы. У нас должно получиться, что-то подобное на рисинке ниже.
Все готово! Остается только нажать F5 и убедиться, что отладчик остановился на тестовой строке.
С помощью этого метода отладка служб становится ничем не труднее отладки обычного консольного приложения. Надеюсь это кому-нибудь пригодиться.