检测并排安装?

时间:2019-01-23 14:46:52

标签: wix installer bootstrapper

我们想引入一个托管的引导程序,该程序可以检测目标计算机上已经安装的软件产品,然后提供安装,更新,降级,修复和卸载的选项。在软件包中使用相同的UpgradeCode可以很好地工作。

我们的问题是并行安装:如果版本不在同一“主要发行版本”中,则应允许并行安装该软件。因此,我们计划在每个新的“主要版本”中更改UpgradeCode。

现在的问题是:检测并排安装的软件包(不是当前Bootstrapper捆绑包中的软件包)的最佳方法是什么?还是有更好的选择并排安装一边不更改UpgradeCode?

2 个答案:

答案 0 :(得分:0)

捆绑软件可同时处理捆绑软件和MSI级别的升级。 MSI级别升级或并行安装由MSI软件包的编写方式及其使用的升级代码来处理。据我对您的问题的理解,如果MSI具有新的专业版,则您希望并排安装,如果没有,则要进行升级。

  1. 我能想到的最简单的解决方案是在出现重大发行时更改捆绑升级代码。但是与通常的并行安装一样,这会使事情变得复杂,并且将需要管理多个捆绑包以及多个升级代码。

例如,您安装了MSI 1.0.0.0,捆绑升级代码为“ abc”。当新的MSI 1.1.0.0到来时,您将使用带有“ abc”的相同捆绑软件并进行安装。这将卸载MSI 1.0.0.0并安装1.1.0.0。

当MSI 2.0.0.0出现时,您将更改捆绑软件升级代码“ xyz”。这将安装新的MSI 2.0.0.0(前提是他们已更改MSI中的升级代码)。现在,如果您有新的MSI 1.3.0.0,则必须确保在安装1.3之前将捆绑包升级代码改回“ abc”。希望您能理解我所谈论的问题/复杂性。当您要进行升级时,并排安装始终是一个问题,如果有选择,我将不做任何处理。

  1. 现在,您拥有的另一个选择是处理同一捆绑包中的多个MSI版本。如果您知道新主要版本的升级代码,则可以根据升级代码执行product search,然后决定要卸载现有版本并安装新版本还是仅升级现有版本。

    <util:ProductSearch Id="ProductSearch"
                        UpgradeCode="{ProductC_MSI_UpgradeCode_GUID}"
                        Variable="ProductInstalled"
                        Result="state"/>
    

您可以使用变量ProductInstalled来检查产品/升级代码是否已经存在,然后在捆绑软件中进行相应的更改。

答案 1 :(得分:-1)

我为我的问题想出了一个解决方案:与其查找所有旧的和即将出现的升级代码(由于我们也允许降级而出现),而是在安装过程中将ProductCode保存在注册表中的特定位置–当然删除在卸载过程中。
在捆绑包链中,添加一个带有检测条件的附加ExePackage ,该程序将检查注册表中特定位置是否存在条目。如果有条目,我将获得PoductCode,可用于修复和卸载产品并获取有关该产品的信息。

但是,即使安装了未知的UpgradeCode,我现在也可以检测到已安装的软件,并让用户决定如何处理。很棒的事情是,当触发卸载或修复时,引导程序会将其视为与其他所有程序包一样,并启动可执行文件。通过ExePackage的UninstallCommand和RepairCommand,我提供了可执行文件ProductCode以及是否要卸载或修复的信息。

      <ExePackage Id="Detecter" 
                  UninstallCommand="MsiExec.exe /X{[PRODUCTCODE_OF_INSTALLED]}"
                  RepairCommand="MsiExec.exe /I{[PRODUCTCODE_OF_INSTALLED]}" 
                  InstallCommand="MsiExec.exe /I{[TEMP_PATH_OF_MSI]}"
                  SourceFile="...\Detecter.exe"
                  DetectCondition="LOOKFORVAR">
      </ExePackage>

可执行文件本身仅使用参数“ MsiExec.exe / X {ProductCode}”启动Windows Installer,并等待完成。当然,采用这种方法时,并排安装的数量受到限制,并且引导程序必须确保并排安装的数量不会超过捆绑包链中其他ExePackages的数量。