Обработка команды SERVICE_CONTROL_PRESHUTDOWN в .Net Windows сервисе
21.12.2007 Оставьте комментарий
В Windows Vista и выше появилась новая управляющая команда для сервисов — SERVICE_CONTROL_PRESHUTDOWN (0x0F). Для её использования нужно задать флаг SERVICE_ACCEPT_PRESHUTDOWN (0x100) и обработать в обработчике HandlerEx.
В .Net Framework (если, конечно, вы наследуете свой класс от System.ServiceProcess.ServiceBase) команду SERVICE_CONTROL_PRESHUTDOWN обработать можно через переопределение виртуального метода OnCustomCommand, а вот задать флаг "легальными" способами не получится.
Но можно задать, прописав в конструкторе следующий код:
Type type = typeof(ServiceBase);
FieldInfo fi = type.GetField("acceptedCommands", BindingFlags.Instance | BindingFlags.NonPublic);
int val = (int)fi.GetValue(this);
fi.SetValue(this, val | 0x100);
Теперь нужно только переопределить обработчик и обрабатывать там команду
protected override void OnCustomCommand(int command)
{
if (command == 15)
EventLog.WriteEntry("OnCustomCommand" + command.ToString());
}
PS. Конечно же так не рекомендуется делать, т.к. Microsoft в любой момент может поменять имя переменной/способ задания статуса/ещё что-нибудь
Tags: Vista, Windows 2008 Server, SERVICE_ACCEPT_PRESHUTDOWN, SERVICE_CONTROL_PRESHUTDOWN, C#, .Net Framework, Windows Service