У нас есть пользовательское действие, которое мы хотим запустить ТОЛЬКО при крупном обновлении. Проблема в том, что CA откладывается, потому что ему нужен доступ к системным файлам (он удаляет старую версию программы из INI-файла). Поскольку CA отложен, он имеет доступ только к свойству CustomActionData.Wix: Условное отложенное пользовательское действие
Итак, моя первая попытка состояла в том, чтобы установить CustomActionData, если UPGRADINGPRODUCTCODE был истинным, а затем установить CA, который фактически обновил CustomActionData. Это не удалось - CustomActionData не был установлен, я предполагаю, потому что только в пределах пользовательское действие и не используется в качестве условия для пользовательского действия.
Вот СА я определил:
<CustomAction Id="MyCA.SetProperty" Return="check" Property="MyCA"
Value="[UPGRADINGPRODUCTCODE]" />
<CustomAction
Id="MyCA"
BinaryKey="MyIniProcessingProgram"
ExeCommand="MyArgs"
Execute="deferred"
Impersonate="no"
Return="ignore"/>
А вот мой InstallExecuteSequence:
<RemoveExistingProducts After="InstallValidate" />
<Custom Action="MyCA.SetProperty" Before="InstallFinalize"/>
<Custom Action="MyCA" After="MyCA.SetProperty">
CustomActionData
</Custom>
Я также попытался:
- Создание MyCA.SetProperty обусловливающие UPGRADINGPRODUCTCODE, то планирование MyCA после него - не работает, потому что даже если MyCA.SetProperty не запускается, действие «После».
Было бы лучше, если бы мы могли избежать действий JavaScript/VBScript или прибегать к проверке значения CustomActionData в самой программе обновления INI; идея состоит в том, чтобы сделать CA сам условным, поэтому мы не запускаем его, если условие (основное обновление) не является истинным.
Ahh, неудивительно, что у моей новой версии никогда не было UPGRADINGPRODUCTCODE. Я думал, что это связано с тем, что действие было отложено, но это просто потому, что это свойство задано только в версии _be upgrade. Спасибо, что указали мне на ActionProperty, что позволило мне легко решить мою проблему. – 2010-12-03 21:57:41