Иногда важно проанализировать, что происходит во время запуска службы. Присоединение к процессу здесь не помогает, потому что вы недостаточно быстры, чтобы подключить отладчик во время запуска службы до.
Краткий ответ: я использую следующие 4 строки кода , чтобы сделать это:
#if DEBUG
base.RequestAdditionalTime(600000); // 600*1000ms = 10 minutes timeout
Debugger.Launch(); // launch and attach debugger
#endif
Они вставляются в метод OnStart
службы следующим образом:
protected override void OnStart(string[] args)
{
#if DEBUG
base.RequestAdditionalTime(600000); // 10 minutes timeout for startup
Debugger.Launch(); // launch and attach debugger
#endif
MyInitOnstart(); // my individual initialization code for the service
// allow the base class to perform any work it needs to do
base.OnStart(args);
}
Для тех, кто не делал этого раньше, я включил подробные советы ниже , потому что вы можете легко застрять. Следующие советы относятся к Windows 7x64 и Visual Studio 2010 Team Edition , но должны быть действительными и для других сред.
Важно: Развернуть службу в «ручном» режиме (используя либо утилиту InstallUtil
из командной строки VS, либо запустить подготовленный вами проект установщика службы). Откройте Visual Studio до , затем запустите службу и загрузите решение, содержащее исходный код службы - установите дополнительные точки останова в соответствии с вашими требованиями в Visual Studio - затем запустите службу через Панель управления службами.
Из-за кода Debugger.Launch
это вызовет диалоговое окно «Необработанное исключение Microsoft .NET Framework произошло в Servicename.exe ». появляться. Нажмите Да, отладку Servicename.exe , как показано на скриншоте:
Впоследствии, особенно в Windows 7, UAC может попросить вас ввести учетные данные администратора. Введите их и введите Да :
После этого появляется известное окно отладчика Visual Studio Just-In-Time . Он спросит вас, хотите ли вы отладить с помощью удаленного отладчика. Прежде чем нажать Да , выберите, что вы не хотите открывать новый экземпляр (2-й вариант) - новый экземпляр здесь не поможет, потому что исходный код не будет отображаться. Таким образом, вы выбираете экземпляр Visual Studio, который вы открыли ранее:
После того, как вы нажали Да , , через некоторое время Visual Studio покажет желтую стрелку прямо в строке, где находится оператор Debugger.Launch
, и вы сможете отлаживать свой код. (метод MyInitOnStart
, который содержит вашу инициализацию).
Нажатие F5 немедленно продолжает выполнение, до достижения следующей подготовленной вами точки останова.
Подсказка: Чтобы сохранить работу сервиса, выберите Отладка -> Отключить все . Это позволяет запустить клиент, обменивающийся данными со службой, после того, как он правильно запустился и вы закончили отладку кода запуска. Если вы нажмете Shift + F5 (прекратить отладку), это приведет к прекращению обслуживания. Вместо этого вы должны использовать Service Control Panel , чтобы остановить его.
Примечание , что
Если вы создаете Release, , тогда отладочный код автоматически удаляется и служба работает нормально.
Я использую Debugger.Launch()
, который запускается и подключает отладчик . Я также проверил Debugger.Break()
, который не работал , поскольку при запуске службы отладчик еще не подключен (что вызывает ошибку "1067: процесс неожиданно завершен. ").
RequestAdditionalTime
устанавливает более длительное время ожидания для запуска службы (это , а не задерживает сам код, но немедленно продолжит работу с оператором Debugger.Launch
). В противном случае тайм-аут по умолчанию для запуска службы слишком короткий, и запуск службы завершится неудачно, если вы не вызовите base.Onstart(args)
достаточно быстро из отладчика. Практически, 10-минутный тайм-аут предотвращает появление сообщения « служба не отвечает ...» сразу после запуска отладчика.
Как только вы привыкнете к этому, этот метод очень прост, потому что вам просто нужно добавить 4 строки к существующему сервисному коду, что позволяет быстро получить контроль и отладку.