Здравствуйте, хабралюди. Если вы никогда не писали службы Windows, но вам вдруг понадобилось, то этот небольшой пост для вас.
Если вы взялись за написание службы, то встаёт вопрос об её отладке. В интернетах в основном пишут про способ, который заключается в подключении отладчика к уже запущенному процессу службы, про альтернативу которому я и хочу рассказать. Т.к. служба — это не совсем обычный процесс Windows, просто запустить её из Visual Studio у вас не получится.
При попытке запуска вам будет показано сообщение, что, мол, служба запуститься не может и вам нужно использовать
Для установки службы вам потребуется консоль Visual Studio, которая находится по пути
После запуска консоли переходим в директорию, в которую собирается ваша служба в режиме
Переходим к самому интересному :-)
У этого способа есть недостаток: без дополнительных ухищрений не получится отладить код, находящийся в обработчике
В код модуля
Этот код подключает отладчик к процессу и компилируется только в режиме
Выбираете запущенный экземпляр Visual Studio, нажимаете
предложил Gwynbleidd
Есть еще способ — предусматривать возможность запуска службы как консольного приложения. Например, в командной строке передавать /console, и если этот флаг установлен, стартовать приложение как консольное, если нет — как службу.
Преимущества такого подхода:
Очень просто отлаживать, по сути дела, как обычное консольное приложение. В консоль можно выводить отладочную информацию
Спасибо komr за помощь в отладке текста :-)
Зачем это всё?
Если вы взялись за написание службы, то встаёт вопрос об её отладке. В интернетах в основном пишут про способ, который заключается в подключении отладчика к уже запущенному процессу службы, про альтернативу которому я и хочу рассказать. Т.к. служба — это не совсем обычный процесс Windows, просто запустить её из Visual Studio у вас не получится.
Установка службы
При попытке запуска вам будет показано сообщение, что, мол, служба запуститься не может и вам нужно использовать
installutil.exe
для её установки.Для установки службы вам потребуется консоль Visual Studio, которая находится по пути
Пуск → Программы → Visual Studio 2008 → Visual Studio Tools → Visual Studio 2008 Command Prompt
(в зависимости от версии установленной VS путь может отличаться)После запуска консоли переходим в директорию, в которую собирается ваша служба в режиме
Debug
и устанавливаем её:installutil.exe /i <имя вашей сборки со службой>
Более вам installutil.exe
не потребуется. Для удобства запускаем консоль управления службами Windows:services.msc
Теперь консоль Visual Studio можно закрыть. Переходим к самому интересному :-)
Отладка службы
Способ №1 (подключение отладчика)
- Запустите службу с помощью консоли управления службами Windows.
- В Visual Studio выберите
в появившемся диалоговом окне выберите имя процесса службы и нажмите кнопкуTools → Connect To Process
Attach
У этого способа есть недостаток: без дополнительных ухищрений не получится отладить код, находящийся в обработчике
OnStart
. Способ №2 (подключение отладчика из исходного кода)
В код модуля
program.cs
, сразу после начала метода Main()
добавляем следующее:#if DEBUG
System.Diagnostics.Debugger.Launch();
#endif
Этот код подключает отладчик к процессу и компилируется только в режиме
DEBUG
. Теперь для отладки службы её нужно запускать не из Visual Studio, а с помощью консоли управления службами (или команды net start
). Сразу после запуска появится диалоговое окно выбора отладчика:Выбираете запущенный экземпляр Visual Studio, нажимаете
Yes
и наслаждаетесь отладкой!Способ №3 (запуск с параметрами командной строки)
предложил Gwynbleidd
Есть еще способ — предусматривать возможность запуска службы как консольного приложения. Например, в командной строке передавать /console, и если этот флаг установлен, стартовать приложение как консольное, если нет — как службу.
Преимущества такого подхода:
Очень просто отлаживать, по сути дела, как обычное консольное приложение. В консоль можно выводить отладочную информацию
Спасибо komr за помощь в отладке текста :-)