WIX MSI 在 MSI 创建的目录中从 DLL 库安装驱动程序导致升级期间出现问题

WIX MSI Installing driver from DLL library in directory created by MSI causes issues during upgrade

1.简介

我有一个通过 WIX 工具集构建的 MSI 安装程序。 此安装程序包含一个 dll 库和一个 *.cab 文件,用于在安装我的应用程序时安装第 3 方驱动程序。此过程按以下步骤完成:我的 MSI 在 INSTALLDIR 中创建了一个目录,然后通过从提到的 dll 执行延迟的自定义操作来安装驱动程序。我认为这种模式并不是真正有效的模式,但这是一个旁注。

在升级过程中,MSI 安装驱动程序的目录被删除。这会在需要升级驱动程序时引起问题,因为它必须通过 dll 库中定义的另一个自定义操作来完成,并且必须存在那些已删除的文件。请注意:我无法在升级过程中卸载和安装驱动程序,很遗憾,这是一个限制。

2。解决方法

RemoveExistingProduct 安排在 InstallInitialize 之后。 由于驱动程序的文件在升级过程中不能被触及,作为一种解决方法,我已经将 RemoveExistingProduct 更改为在 InstallExecute 之后执行,因此文件不会先删除然后再安装,但是如果需要,而是覆盖。我知道这 affects the rollout procedures.

问题:这是处理它的 proper/better 方式(尽可能适当的解决方法...)?它会导致一些不需要的副作用吗?到目前为止,我在日志中观察到:

Disallowing uninstallation of component: {GUID-HERE} since another client exists

另一个问题:这是预期的吗?

3。细节和一些XML

总是生成Product IDPackage ID("*")。 UpgradeCode 在不同版本之间保持不变。 REINSTALLMODE="omus"。 升级通过 <Upgrade> 元素完成:

<Upgrade Id="$(var.UpgradeCode)">
  <UpgradeVersion OnlyDetect='no' Property='AUTO_FOUND_PREVIOUS'
    Maximum='$(var.VersionNumber)' IncludeMaximum='no'
    IgnoreRemoveFailure="yes" MigrateFeatures="yes" />

  <UpgradeVersion OnlyDetect='no' Property='AUTO_FOUND_SELF'
   Minimum='$(var.VersionNumber)' IncludeMinimum='yes'
   Maximum='$(var.VersionNumber)' IncludeMaximum='yes'
   IgnoreRemoveFailure="yes" MigrateFeatures="yes" />

  <UpgradeVersion OnlyDetect='yes' Property='AUTO_FOUND_NEWER'
   Minimum='$(var.VersionNumber)' IncludeMinimum='no' />
</Upgrade>

正如我提到的,安装驱动程序的目录也由我的 MSI 管理:

<DirectoryRef Id='INSTALLDIR_DRIVER'>
    <Component Id='cmp_driverPlaceholderDir' Guid='{CONST-GUID-HERE}'>
        <CreateFolder />
        <RemoveFolder Id='INSTALLDIR_DRIVER' On='uninstall' />
    </Component>
</DirectoryRef>

其他组件也有固定的 GUID。

我也很想听听如何以正确的方式处理通过自定义操作安装外部驱动程序,如果您对此有所了解,请不要犹豫。

曾经 DIFX 是使用 MSI 安装驱动程序的“权威方法”,但现在已被 Microsoft 弃用。推荐的替代品称为 Setup APIDevice and Driver Installation Reference(取决于您需要的平台支持),但在 Windows Installer 的范围内,每次演变都更难使用(尽管我一直很想多次编写包装这些 API 的 WiX 扩展以帮助那里的所有驱动程序编写者)因为在使用延迟自定义操作时需要维护 MSI 的事务保证。

当前的最佳做法(2021 年初)是使用支持多个包的引导程序并将安全地缓存您的包(因此它们在升级和卸载等过程中可用),并让它安装您的驱动程序和你的 MSI。