Убить службу Windows принудительно в WIX
У меня есть служба Windows, которая будет установлена как часть установки wix. Проблема заключается в том, что в настоящее время служба находится в рабочем состоянии и не отвечает на остановку из-за плохо написанного кода в методе OnStop службы.
Поэтому в следующий раз, когда пользователь попытается установить обновленную версию, установка завершится неудачно, потому что служба никогда не остановится, когда wix попытается остановить службу.
Есть ли способ узнать, занимает ли wix слишком много времени для удаления, и могу ли я завершить процесс, если получу это уведомление?
Кроме того, есть ли способ убить процесс в зависимости от версии продукта?
Спасибо
2 ответа
Я нашел решение для этого после рытья в течение некоторого времени.
Я создаю новый проект C# с пользовательскими действиями и чередую свои действия перед InstallInitialize.
В моем методе пользовательских действий C# я читаю существующую версию установленного файла, используя FileVersionInfo.GetVersionInfo(filePath);
Затем я проверяю нужную версию, которую я хочу проверить, и, если условие соответствует, я убиваю свой процесс обслуживания, используя
foreach (Process proc in Process.GetProcessesByName("ProcessName"))
{
proc.Kill();
session.Log("Service Killed");
}
Для этого необходимо предварительно установить Wix toolset v3.11.1.
Я не должен отвечать на это, так как прошло много времени с тех пор, как я имел дело с такими вещами, но, черт возьми, давайте попробуем.
- Элемент CloseApplication: Возможно, я бы сначала попробовал элемент CloseApplication WiX. Я сомневаюсь, что это сработает для службы, но это самый удобный подход, который я могу придумать, не задумываясь.
- Sysinternals PsKill: PsKill Марка Руссиновича стоит попробовать. Я думаю, что его инструменты можно распространять, поэтому вы можете включить их в свои настройки, и они всегда хороши. Вы должны вызывать его из пользовательского действия с повышенным режимом отложенного режима, которое всегда более сложное, чем использование встроенной конструкции WiX.
- Taskkill: есть также встроенный Taskkill, который я никогда не использовал. Рекомендуемое использование с инструментом sc.
Я хочу подчеркнуть, что я на самом деле не тестировал эти инструменты для уничтожения сервисов, и у меня нет времени делать это прямо сейчас. Могут быть проблемы с секвенированием, в результате чего StopServices
может быть запланировано до CloseApplication
Запланировано выполнение настраиваемого действия из WiX. Пожалуйста, проверьте InstallExecuteSequence
используя Orca (внизу) после компиляции, чтобы увидеть, так ли это.