繁体   English   中英

CustomAction称为两次

[英]CustomAction Called Twice

我使用Wix,并具有customAction和ab 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>

问题是我的自定义操作被调用了两次 -(在自定义操作中,我将内容打印到日志文件中,并且看到了两次)

我试图评论这一行:

 <MajorUpgrade AllowDowngrades="no" AllowSameVersionUpgrades="yes" DowngradeErrorMessage="Can't downgrade from newer version"  />

它解决了问题。 但是我需要进行重大更新,因此我尝试取消注释上面的行,并向customAction添加条件:

<InstallExecuteSequence>
         <Custom Action='PreInstallAction' Before='InstallInitialize'>
            NOT Installed AND NOT PATCH
         </Custom>
      </InstallExecuteSequence>

但是现在ny customAction被再次调用了两次...我的状况有问题吗? 我还有其他解决方案吗?

您的自定义操作执行两次,因为它在新安装和旧安装的执行序列中。 当RemoveExistingProducts执行主要升级时,它实际上是在运行旧产品的卸载,因此两者都可以使用。 您可以通过在自定义操作的顺序上放置条件表达式来解决此问题,使其仅在旧版本卸载或新版本安装期间运行。

另外,根据此CA实际执行的操作,立即执行调度可能不是最佳选择。 必须在具有Deferred(通常是System Context)执行的InstallInitialize和InstallFinalize之间安排任何更改计算机状态的自定义操作,以确保属性权限和回滚行为(您还必须编写回滚和提交动作)。

以我的经验,自定义操作在升级时会被调用两次,因为它们在安装和卸载时都会执行。 (升级时,会同时发生安装和卸载事件。)

要解决此问题,您需要说“如果我要升级,则此操作也不得在卸载时执行”。 这可以逻辑上写成

upgrading => not uninstall

,(由于A⇒B⇔¬A∨B)可以重写为

(not upgrading) OR (not uninstall)

因此,在WIX中编写的条件是:

<Custom Action="PreInstallAction" Before="InstallInitialize">
      (NOT UPGRADINGPRODUCTCODE ) OR (NOT ( REMOVE="ALL"))</Custom>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM