安装和升级时仅执行一次自定义操作

问题描述 投票:0回答:2

我有一个自定义操作,在安装或升级期间只需执行一次。

发生的情况是,如果系统上已安装同一产品的旧版本,则自定义操作将执行两次。但是,当系统上没有安装以前的版本(全新安装)时,自定义操作仅执行一次。

我修改了自定义操作的条件。现在,升级时,自定义操作仅调用一次(这是正确的),但在全新安装(未安装以前的版本)中,自定义操作不会被执行。

<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>

当前行为: 自定义操作仅在升级时执行一次,但在安装时永远不会调用。

预期行为: 自定义操作仅在升级或安装时执行一次。

wix windows-installer custom-action wix3 wix3.11
2个回答
0
投票

我想说的是,您需要一个“或”而不是“与”。“未安装”涵盖全新安装“升级产品代码”涵盖升级安装。

升级时 NOT Installed 为 false 并且 UPGRADINGProductCODE 对于已安装的版本为空。所以你应该没问题。我还会添加 NOT REMOVE 和 NOT REINSTALLMODE 以禁用卸载时的执行(升级时在已安装的版本中调用您的 CA)和修复。

<![CDATA[(NOT Installed OR UPGRADINGPRODUCTCODE) AND NOT REMOVE AND NOT REINSTALLMODE]]>

0
投票

来自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>
© www.soinside.com 2019 - 2024. All rights reserved.