我有一个自定义操作,在安装或升级期间只需执行一次。
发生的情况是,如果系统上已安装同一产品的旧版本,则自定义操作将执行两次。但是,当系统上没有安装以前的版本(全新安装)时,自定义操作仅执行一次。
我修改了自定义操作的条件。现在,升级时,自定义操作仅调用一次(这是正确的),但在全新安装(未安装以前的版本)中,自定义操作不会被执行。
<CustomAction Id="MyCustomAction"
Return="check"
Execute="deferred"
Impersonate="no"
BinaryKey="MyCustomActions.CA.dll"
DllEntry="MyCustomAction" />
<InstallExecuteSequence>
<Custom Action="MyCustomAction"
Before="InstallFinalize">
<![CDATA[NOT Installed AND UPGRADINGPRODUCTCODE]]>
</Custom>
</InstallExecuteSequence>
当前行为: 自定义操作仅在升级时执行一次,但在安装时永远不会调用。
预期行为: 自定义操作仅在升级或安装时执行一次。
我想说的是,您需要一个“或”而不是“与”。“未安装”涵盖全新安装“升级产品代码”涵盖升级安装。
升级时 NOT Installed 为 false 并且 UPGRADINGProductCODE 对于已安装的版本为空。所以你应该没问题。我还会添加 NOT REMOVE 和 NOT REINSTALLMODE 以禁用卸载时的执行(升级时在已安装的版本中调用您的 CA)和修复。
<![CDATA[(NOT Installed OR UPGRADINGPRODUCTCODE) AND NOT REMOVE AND NOT REINSTALLMODE]]>
来自https://stackoverflow.com/a/17608049/1721136 我拿
<SetProperty Id="_INSTALL" After="FindRelatedProducts" Value="1">
<![CDATA[Installed="" AND PREVIOUSVERSIONSINSTALLED=""]]>
</SetProperty>
<SetProperty Id="_UPGRADE" After="FindRelatedProducts" Value="1">
<![CDATA[PREVIOUSVERSIONSINSTALLED<>"" ]]>
</SetProperty>
然后
<InstallExecuteSequence>
<Custom Action="MyCustomAction"
Before="InstallFinalize">
<![CDATA[_INSTALL OR _UPGRADE]]>
</Custom>
</InstallExecuteSequence>
或者,如果这不起作用,请尝试仅使用新安装程序运行自定义操作并使用属性
<SetProperty Id="_NEWINSTALLER" After="FindRelatedProducts" Value="1">
<![CDATA[NOT UPGRADINGPRODUCTCODE]]>
</SetProperty>