Как выполнить настраиваемое действие перед RemoveExistingProducts с After = "InstallValidate" в WiX - PullRequest
6 голосов
/ 21 декабря 2010

У меня есть что-то вроде этого:

<InstallExecuteSequence>
  <RemoveExistingProducts After="InstallValidate"/>
</InstallExecuteSequence>

Поскольку одна из деинсталляций не удалась, мне нужно выполнить настраиваемое действие, чтобы решить проблему ПЕРЕД RemoveExistingProducts. Что-то в строках:

<CustomAction Id="FixStuff" .. />

<InstallExecuteSequence>
  <Custom Action="FixStuff" Before="RemoveExistingProducts" />
  <RemoveExistingProducts After="InstallValidate"/>
</InstallExecuteSequence>

Это, конечно, не работает, так как пользовательское действие не может быть до InstallInitialize. Я бы очень хотел удалить существующие продукты между InstallValidate и InstallInitialize, но я бы хотел выполнить FixStuff перед удалением существующих продуктов.

Возможно ли это сделать?

1 Ответ

7 голосов
/ 23 декабря 2010

К сожалению, вы не можете запустить пользовательское действие с повышенными привилегиями до RemoveExistingProducts с вашей текущей конфигурацией.

Некоторые возможные подходы:

  1. Переместите RemoveExistingProducts прямо перед InstallFinalize. Это решает проблему пользовательских действий, но могут возникнуть и другие проблемы, поскольку у этого подхода есть много ограничений (компоненты должны сохранять свои имена и идентификаторы GUID между версиями, ваши пользовательские действия должны знать, что обновление выполняется в конце установки и т. 1007 *

  2. Создайте загрузчик EXE, который исправляет старый установщик перед запуском нового MSI. Для этого загрузчика могут потребоваться права администратора через манифест:

http://msdn.microsoft.com/en-us/library/bb756929.aspx

  1. Восстановить сломанный MSI, используя этот метод:

    • исправить проблему в старом MSI
    • создать загрузчик BAT или EXE, который запишет его с помощью этой команды:

    msiexec / fv

    • распространите этот MSI как обновление до вашего нового пакета

Когда ваш новый пакет запускает RemoveExistingProducts, старый кэшированный MSI должен быть исправлен, и он должен удаляться правильно.

...