1

我正在使用引导程序来包含单个 MSI。如果我已经安装了捆绑包,然后通过启动捆绑包 EXE 重新安装,它可以检测到捆绑包已经安装。但是,如果我重建解决方案,即使没有更改单行代码,捆绑安装 EXE 也不会检测到捆绑已安装,而是会安装新版本(在程序和功能表中创建重复条目),但会跳过安装微星。如果我启动 MSI,它将检测到已安装相同的软件包。这会导致很大的问题,因为我每天都有构建工作来构建带有应用程序的安装程序,因此它无法检测是否安装了相同的版本。烧录配置很简单

<Bundle Name="ProductName" Version="1.0.0.0" Manufacturer="CompanyName" 
      UpgradeCode="28485414-29d0-4b3d-ba8c-33b5f993dfc3">
<BootstrapperApplicationRef   Id="WixStandardBootstrapperApplication.HyperlinkSidebarLicense">
  <bal:WixStandardBootstrapperApplication
    LicenseUrl=""
    LogoFile="..\Resources\Icon\small.png"
    ShowVersion="yes"
    SuppressOptionsUI="yes"
    LogoSideFile="..\Resources\Icon\banner-side.bmp"
    LocalizationFile="HyperlinkTheme.wxl"
    xmlns:bal="http://schemas.microsoft.com/wix/BalExtension" />
</BootstrapperApplicationRef>
    <Chain>
  <MsiPackage SourceFile="$(var.Installer.TargetPath)" Id="MsiEnUs" DisplayInternalUI="yes"/>
    </Chain>
</Bundle>

MSI包定义为

    <Product Id="*" Name="$(var.ProductDisplayName)" Language="1033" Version="$(var.ProductVersion)" Manufacturer="$(var.CompanyName)" UpgradeCode="c1b3c617-0af8-4df8-8dff-e893f7bbb30a">
<Package InstallerVersion="200" Compressed="yes"  Platform="x64"  InstallPrivileges="elevated"  InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />

查看日志,可以发现 WixBundleInstalled 为 0。

4

1 回答 1

3

WixBundleInstalled 指的是这个执行包。每次重建时,您都会生成具有相同升级代码的捆绑包。这种行为很像 MSI 中的产品 ID。当您运行引导程序时,您可以看到此 GUID 是什么,并且引导程序会将一些信息提取到 %temp% 目录中的文件夹中,这些文件夹以代表引导程序本身的 GUID 值命名。

当您查看 WixBundleInstalled 时,安装程​​序实际上会检查注册表位置

SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{ThisBundleGUID}对于“Installed”键并检查其值是否为 1。

您的引导程序的每个新版本都会为该特定捆绑包 exe 生成一个新的 GUID。

您遇到的问题是默认情况下 wix burn 引导程序支持相同的版本升级。相反,它们将与相同版本的其他引导程序并排安装。您可以修改您的引导程序代码以“支持”此功能,但避免这种情况的普遍接受且不易出错的方法是通过在每次构建时增加部分版本来实现捆绑包的正确版本控制。

请注意,WiX Burn Bootstrappers 会比较 Window MSI 忽略第 4 部分的第 4 部分的版本。

于 2017-02-23T19:05:29.753 回答