Как выполнить Пользовательское действие перед RemoveExistingProducts с After= "InstallValidate" в WiX

у меня что-то вроде этого:

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

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

<CustomAction Id="FixStuff" .. />

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

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

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

1 ответов


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

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

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

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

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

  1. восстановить сломанный MSI с помощью этого метода:

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

    msiexec / fv

    • распространите этот MSI в качестве обновления перед новым пакетом

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