我们想引入一个托管的引导程序,该程序可以检测目标计算机上已经安装的软件产品,然后提供安装,更新,降级,修复和卸载的选项。在软件包中使用相同的UpgradeCode可以很好地工作。
我们的问题是并行安装:如果版本不在同一“主要发行版本”中,则应允许并行安装该软件。因此,我们计划在每个新的“主要版本”中更改UpgradeCode。
现在的问题是:检测并排安装的软件包(不是当前Bootstrapper捆绑包中的软件包)的最佳方法是什么?还是有更好的选择并排安装一边不更改UpgradeCode? p>
答案 0 :(得分:0)
捆绑软件可同时处理捆绑软件和MSI级别的升级。 MSI级别升级或并行安装由MSI软件包的编写方式及其使用的升级代码来处理。据我对您的问题的理解,如果MSI具有新的专业版,则您希望并排安装,如果没有,则要进行升级。
例如,您安装了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”。希望您能理解我所谈论的问题/复杂性。当您要进行升级时,并排安装始终是一个问题,如果有选择,我将不做任何处理。
现在,您拥有的另一个选择是处理同一捆绑包中的多个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的数量。