Служба Win не остановлена ​​и не удалена во время обновления

У меня проблема с установщиком, созданным с помощью Wix 3.7. У меня есть продукт, в котором устанавливается служба Windows. Проблема в том, что во время обновления продукта (с версии 1.1 до версии 1.2, тот же UpgradeCode, разные свойства ProductCode Guid и MajorUpgrade) я хочу заменить исполняемый файл, запущенный Службой. Файл используется старым процессом (например, службой Windows). Я подозреваю, что установщик 1.1 используется для удаления продукта 1.1, и в этом установщике ServiceControl был недопустимым (т.е. не был настроен на остановку при удалении).

Мое предположение:

  1. 1.2 установщик обнаруживает существующий продукт (из-за кода обновления)
  2. удалить старый продукт
  3. служба не остановлена ​​/ не удалена из-за ошибки в установщике 1.1
  4. 1.2 пытается заменить исполняемый файл, но процесс все еще выполняет исполняемый файл.

Обратите внимание, что я настроил установщик 1.1 с помощью Orca, чтобы получить правильный ServiceControl, который останавливает и удаляет службу при удалении. Мы называем это 1.1tweaked. Если я устанавливаю продукт с помощью 1.1tweaked, а затем использую программу установки 1.2, все работает должным образом.

Я уже пробовал любую возможную конфигурацию ServiceControl в установщике 1.2, но это бесполезно, если описанные выше шаги верны.

Как я могу принудительно остановить "текущую" службу Windows в установщике 1.2? Похоже, мне нужно настраиваемое действие. Любые идеи? Спасибо


person peval27    schedule 25.01.2017    source источник
comment
Когда вы запланировали RemoveExistingProducts? Это может сработать, если вы запланируете это afterInstallExecute, поскольку установщик 1.1 больше не будет пытаться удалить службу из-за подсчета ссылок на компоненты, если ваша установка 1.1 соответствовала предлагаемым правилам для компонентов.   -  person Brian Sutherland    schedule 25.01.2017
comment
@BrianSutherland Я не определил это, полагаю, я полагаюсь на MajorUpgrade. Вы предлагаете добавить <RemoveExistingProducts After="InstallExecute"/> в <InstallExecuteSequence>?   -  person peval27    schedule 25.01.2017
comment
@BrianSutherland или лучше, используйте Schedule="afterInstallExecute" в MajorUpgrade   -  person peval27    schedule 25.01.2017
comment
Да, я предлагаю именно это. Однако это может привести к нескольким проблемам, если управление версиями файлов не выполняется должным образом, поскольку оно не обновляет файлы. Это должно работать нормально, если следовать передовым методикам, но это не гарантируется.   -  person Brian Sutherland    schedule 25.01.2017
comment
Если это не сработает, вам, возможно, придется создать патч для msi 1.1, используя ваш 1.1tweaked (stackoverflow.com/questions/28462231/). Или просто поместите сообщение в установщик 1.2, сообщающее пользователю о необходимости остановить службу, поскольку вы не можете выполнить отложенное настраиваемое действие для остановки службы, которая запускается до RemoveExistingProducts, если вы запланировали RemoveExistingProducts на более раннее.   -  person Brian Sutherland    schedule 25.01.2017
comment
@BrianSutherland Спасибо за вашу помощь. Я решил проинформировать пользователя, так как другие варианты кажутся слишком рискованными и того не стоит.   -  person peval27    schedule 26.01.2017


Ответы (1)