我们有一个自定义操作,我们只想在主要升级时运行。麻烦的是,CA被推迟,因为它需要访问系统文件(它从INI文件中删除旧版本的程序)。由于CA是延迟的,因此它只能访问CustomActionData属性。
所以我的第一次尝试是在UPGRADINGPRODUCTCODE为真时设置CustomActionData,然后调整实际在CustomActionData上进行升级的CA.失败了 - 我没有设置CustomActionData,我认为因为它只在自定义操作中可见,并且不能用作自定义操作的条件。
以下是我定义的CA:
<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>
我也尝试过:
最好是我们可以避免JavaScript / VBScript操作,或者在INI更新程序本身中检查CustomActionData的值;我的想法是让CA 本身有条件,所以除非条件(主要升级)为真,否则我们不会启动它。
答案 0 :(得分:1)
为什么不使用此自定义操作:
<CustomAction
Id="MyCA"
BinaryKey="MyIniProcessingProgram"
ExeCommand="MyArgs"
Execute="deferred"
Impersonate="no"
Return="ignore"/>
使用此InstallExecuteSequence?
<Custom Action="MyCA" After="InstallValidate">
UPGRADINGPRODUCTCODE
</Custom>
请注意,UPGRADINGPRODUCTCODE在正在升级的软件包中设置,因此仅在旧版本的卸载过程中可用。
如果要检测新版本中的升级,可以使用“升级”表中的“ActionProperty”列: http://msdn.microsoft.com/en-us/library/aa372379(VS.85).aspx
基本上,您需要为较旧版本和较新版本定义升级规则: http://wix.sourceforge.net/manual-wix2/wix_xsd_upgradeversion.htm
这样您就可以通过自定义属性检测旧版本。然后,可以使用此属性来调整自定义操作。
答案 1 :(得分:0)
用于执行任何操作(包括延迟)的条件是直接序列的条件。这意味着您可以直接使用UPGRADINGPRODUCTCODE
作为条件的一部分,即使是您的延期操作。
当安装程序在即时阶段达到此序列时,它将评估条件,并在条件为真时安排延迟执行。然后,当它运行延迟序列时,它将只运行在即时阶段安排的所有操作。