MSI 安装程序 - 有条件地安装先决条件

MSI Installer - conditional installation of prerequisites

我遇到了 SAP Crystal Reports SDK 的问题。它从网络上消失了,所以我不得不为每个包创建自己的 ClickOnce Bootstrap(为此我使用了名为 Bootstrap 生成器的软件)。

它几乎按预期工作,它在安装主程序之前安装 SAP Crystal 报告。

问题是它正在安装 SAP Crystal 每次我 运行 安装程序时报告,即使它已经安装了。

我的 MSI 安装程序似乎没有检测到已安装的 SAP 版本 Crystal 报告。

Product.xml 看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<Product ProductCode="SAP.Crystal.reports.x86" xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper">
  <PackageFiles CopyAllPackageFiles="false">
    <PackageFile Name="crruntime_32bit_13_0_15.msi" PublicKey="3082010A0282010100A5F02AFCBAF295DD82C482B0AA83782A08EA007635AFE2E76B57558D6AD708A1C96B86DA81894CDBB42214C26674A5C7F233D8BC76C77B3B2CBC8E38033C3C9C26FC5CD0789A462A2A6B2B19AC9321C851A08544DBF42CE697C97B730964C159D533BA56B835B702AA3F30E96CFD76F60A555EBC862828347E468BF126B9EB345A7E488AEA3451E9E9EB8412A600D1DB811A2C0144697048CD41F100E10AB8225658E1C3B7613A06835E628E2556C0F8BFD1408A0A5FED97892F6B99F49F2F436A0293AA5562FBBD5EE89DC667261E058AA767E168867CEAC2081588C1BD800FC2BFCD98773CEFD3266F54EB0DC7DAF4D5CD1867EA897D39E6A289A4A75ECA890203010001" />
  </PackageFiles>
  <Commands Reboot="Defer">
    <Command PackageFile="crruntime_32bit_13_0_15.msi">
      <ExitCodes>
        <DefaultExitCode Result="Success" String="Anunexpectedexitcodewasr" FormatMessageFromSystem="true" />
      </ExitCodes>
    </Command>
  </Commands>
</Product>

Package.xml 看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<Package Name="DisplayName" Culture="Culture" xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper">
  <Strings>
    <String Name="Culture">pl</String>
    <String Name="DisplayName">SAP Crystal reports x86</String>
    <String Name="Anunexpectedexitcodewasr">An unexpected exit code was returned from the installer. The installation failed.</String>
  </Strings>
</Package>

先决条件属性:

如果你想检查是否已经安装了先决条件,你需要在 product.xml 文件中添加 2 个东西。 首先是产品代码或注册表项。 如果您选择产品代码,您可以添加 MSI 安装检查,例如:

<InstallChecks>
    <MsiProductCheck Property="CR32BitExists" Product="{9D52DBF3-229A-4723-BF31-C57C9C1D2A23}" />
    <MsiProductCheck Property="CR64BitExist" Product="{8055CFEA-3871-4C76-A321-E32F63637CC4}" />
  </InstallChecks>

然后您必须添加安装条件,例如(对于 x86):

<InstallConditions>
    <BypassIf Property="CR32BitExists" Compare="ValueEqualTo" Value="1" />
    <BypassIf Property="CR32BitExists" Compare="ValueGreaterThanOrEqualTo" Value="3" />
    <BypassIf Property="ProcessorArchitecture" Compare="ValueNotEqualTo" Value="Intel" />
</InstallConditions>

请注意,CR32BitExists 在安装检查中声明并在 InstallConditions 中使用。 关于使用的值 (1,3) 你可以在这里阅读:

https://docs.microsoft.com/en-us/windows/win32/msi/session-featurerequeststate

修改 product.xml 后您需要重建您的 msi。 当您尝试安装它时,它会在安装检查中查找提到的产品代码。 如果它检测到它安装在 OS 中,它将绕过安装。