我使用Wix,并有一个customAction和一个anb installSequence:
<CustomAction Id='PreInstallAction' BinaryKey='PreInstallBinary' DllEntry='MyCustomAction1' Execute='immediate'
Return='check'/>
<Binary Id='PreInstallBinary' SourceFile='E:\...\MyCustomAction\bin\Release\MyCustomAction.CA.dll'/>
<InstallExecuteSequence>
<Custom Action='PreInstallAction' Before='InstallInitialize'/>
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)
问题是我的自定义操作被调用了两次 - (在自定义操作中,我将东西打印到日志文件中,我看到它们两次)
我试着评论这条线:
<MajorUpgrade AllowDowngrades="no" AllowSameVersionUpgrades="yes" DowngradeErrorMessage="Can't downgrade from newer version" />
Run Code Online (Sandbox Code Playgroud)
它解决了这个问题.但我需要主要更新,所以我尝试取消注释上面的行并为customAction添加一个条件:
<InstallExecuteSequence>
<Custom Action='PreInstallAction' Before='InstallInitialize'>
NOT Installed AND NOT PATCH
</Custom>
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)
但现在ny customAction再次被调用两次......我的情况有什么问题吗?我有其他解决方案吗?
您的自定义操作正在执行两次,因为它位于新旧安装的执行顺序中.当RemoveExistingProducts执行主要升级时,它实际上正在运行旧产品的卸载,因此两者都进入了范围.您可以通过在自定义操作的排序上放置条件表达式来解决此问题,以便它只在卸载旧的或安装新的时运行.
此外,根据此CA实际执行的操作,Immeadiate执行调度可能不是最佳选择.任何更改机器状态的自定义操作都必须在InstallInitialize和InstallFinalize之间进行调度,并使用Deferred(通常是系统上下文)执行来确保属性权限和回滚行为(您还必须创建回滚和提交操作).
| 归档时间: |
|
| 查看次数: |
1486 次 |
| 最近记录: |