У меня странная проблема с установщиком WIX. Он имеет настраиваемое действие, предотвращающее приложение для установки, когда новая версии подарка:Предупреждение о предотвращении перехода WIX вниз отображается в неподходящее время
<Upgrade Id='SOME_GUID'>
<UpgradeVersion OnlyDetect='yes' Property='SELFFOUND'
Minimum='$(var.Version)' IncludeMinimum='yes'
Maximum='$(var.Version)' IncludeMaximum='yes' />
<UpgradeVersion OnlyDetect='yes' Property='NEWERFOUND'
Minimum='$(var.Version)' IncludeMinimum='no' />
</Upgrade>
<InstallExecuteSequence>
<Custom Action='AlreadyUpdated' After='FindRelatedProducts'>SELFFOUND</Custom>
<Custom Action='NoDowngrade' After='FindRelatedProducts'>NEWERFOUND</Custom>
<InstallExecuteSequence>
<CustomAction Id='AlreadyUpdated' Error='$(var.ProductName) has already been updated to $(var.Version) or newer.' />
<CustomAction Id='NoDowngrade' Error='A later version of $(var.ProductName) is already installed.' />
Ничего особенного - все как в учебнике WIX. Я использую интерфейс Mondo с небольшим количеством собственных пользовательских диалогов.
<UIRef Id="WixUI_Mondo" />
Проблема заключается в том, что пользовательское действие «NoDowngrade» выполняет после того, как нажать кнопку «Установить» кнопку, после того, как все шаги конфигурации прошли. Я ожидал увидеть сообщение сразу после запуска установщика. Я проверил installExecuteSEquence в таблице установщика, используя Orca util - «AlreadyUpdated» CA имеет Sequence = 27. В событии FindRelatedProducts есть Sequence = 25. 27 используется другим моим действием «NoDowngrade», почти таким же, как «AlreadyUpdated». Первый диалог пользовательского интерфейса должен быть смещен в последовательности = 49. Предположим, что PrepareDlg имеет это значение в InstallUISequence. Похоже, что ничего не может произойти между FindRelatedProducts и PrepareDlg, кроме моих пользовательских действий.
Но удивительно, что журнал установки говорит обратное:
MSI (c) (90:88) [13:08:03:768]: Running UISequence
MSI (c) (90:88) [13:08:03:768]: PROPERTY CHANGE: Adding EXECUTEACTION property. Its value is 'INSTALL'.
MSI (c) (90:88) [13:08:03:768]: **Doing action: FindRelatedProducts**
Action 13:08:03: FindRelatedProducts. Searching for related applications
Action start 13:08:03: FindRelatedProducts.
FindRelatedProducts: Found application: {E25981A8-83D3-4183-B53C-F6E70FC9D1E0}
MSI (c) (90:88) [13:08:03:769]: PROPERTY CHANGE: Adding SELFFOUND property. Its value is '{E25981A8-83D3-4183-B53C-F6E70FC9D1E0}'.
Action ended 13:08:03: FindRelatedProducts. Return value 1.
MSI (c) (90:88) [13:08:03:770]: Doing action: PrepareDlg
--------------------
MSI (s) (2C:84) [13:08:10:658]: Running ExecuteSequence
MSI (s) (2C:84) [13:08:10:658]: **Doing action: FindRelatedProducts**
Action 13:08:10: FindRelatedProducts. Searching for related applications
Action start 13:08:10: FindRelatedProducts.
MSI (s) (2C:84) [13:08:10:660]: Skipping FindRelatedProducts action: already done on client side
Action ended 13:08:10: FindRelatedProducts. Return value 0.
MSI (s) (2C:84) [13:08:10:660]: Doing action: AppSearch
Action 13:08:10: AppSearch. Searching for installed applications
Action start 13:08:10: AppSearch.
MSI (s) (2C:84) [13:08:10:662]: Skipping AppSearch action: already done on client side
Action ended 13:08:10: AppSearch. Return value 0.
MSI (s) (2C:84) [13:08:10:662]: **Doing action: AlreadyUpdated**
Action 13:08:10: AlreadyUpdated.
Action start 13:08:10: AlreadyUpdated.
APS DTE Axiom Server has already been updated to 12.1.1.1582 or newer.
MSI (s) (2C:84) [13:08:12:420]: Product: APS DTE Axiom Server -- APS DTE Axiom Server has already been updated to 12.1.1.1582 or newer.
Action ended 13:08:12: AlreadyUpdated. Return value 3.
Таким образом, мы можем видеть, что FindRelatedProducts пытались дважды выполнить, но AlreadyUpdated CA выполняется только с второй попытки. В учебниках ничего не говорится о размещении этого центра сертификации в InstallUISEquence. Нужно ли это, или, может быть, это не хороший подход, если его нет? Или вы можете рекомендовать лучшее решение этой проблемы?
Вы также можете добавить атрибут Execute = 'firstSequence' в элемент CustomAction, чтобы он выполнялся только один раз - в InstallUISequence, если у установки есть обычный пользовательский интерфейс или InstallExecuteSequence, если он тихий. – imagi
Спасибо! Теперь я понимаю, для чего нужны эти две записи –