CustomAction称为两次

时间:2012-02-14 11:47:23

标签: c# wix

我使用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>

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

我试着评论这条线:

 <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两次...... 我的病情有问题吗?我还有其他解决办法吗?

2 个答案:

答案 0 :(得分:6)

您的自定义操作正在执行两次,因为它位于新旧安装的执行顺序中。当RemoveExistingProducts执行主要升级时,它实际上正在运行旧产品的卸载,因此两者都进入了范围。您可以通过在自定义操作的排序上放置条件表达式来解决此问题,以便它只在卸载旧的或安装新的时运行。

此外,根据此CA实际执行的操作,Immeadiate执行调度可能不是最佳选择。任何更改机器状态的自定义操作都必须在InstallInitialize和InstallFinalize之间进行调度,并使用Deferred(通常是系统上下文)执行来确保属性权限和回滚行为(您还必须创建回滚和提交操作)。

答案 1 :(得分:0)

我有一个自定义操作 CustomActionUpgrade,其目的是在卸载软件并在 MajorUpgrade 期间安装较新版本之前保存以前安装中的文件。 (存档以前的安装)

像这样编写自定义操作以仅调用一次,并且仅在卸载先前安装之前的升级期间调用它:

<Custom 
  Action='CustomActionUpgrade'
  Before='RemoveFiles'>UPGRADINGPRODUCTCODE AND REMOVE~="ALL" AND NOT REINSTALL="ALL"
</Custom>