【问题标题】:WIX MSI Installing driver from DLL library in directory created by MSI causes issues during upgradeWIX MSI 从 MSI 创建的目录中的 DLL 库安装驱动程序会导致升级期间出现问题
【发布时间】:2021-05-03 16:19:15
【问题描述】:

1.简介

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

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

2。解决方法

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

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

不允许卸载组件: {GUID-HERE},因为另一个客户端存在

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

3.细节和一些 XML

Product ID 和 Package 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。

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

【问题讨论】:

  • 你已经有一个引导程序了吗?
  • 在 InstallExecute 之后放置 RemoveExistingProduct(我假设您没有使用 InstallExecuteAgain 并且 InstallExecute 和 InstallFinalize 之间没有其他操作)没问题,只要您非常严格地遵循“组件规则” .我建议永远不要尝试打补丁(小升级和小更新是一罐蠕虫,你只有在绝对必要时才会涉足,即使那样你也应该再问自己几次)。
  • 您提到的日志中的那一行很可能来自删除您以前的版本。 “另一个客户端”是您刚刚安装的软件包。
  • @B.Murri - 是的,InstallExecute 和 InstallFinalize 之间没有其他操作,只有 RemoveExistingProduct。在小升级和补丁的情况下:我从不这样做,一切都部署为重大升级。确实必须遵循组件规则。

标签: wix windows-installer


【解决方案1】:

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

当前的最佳实践(2021 年初)是使用支持多个软件包的引导程序,并安全地缓存您的软件包(以便在升级和卸载等期间可用),并让它同时安装您的驱动程序和 MSI .

【讨论】:

  • 驱动程序安装确实是一个很长一段时间的严重混乱。它能有多难?这是我之前的两个答案:Windows Hardware Dev Center dashboard(精华的中间页面)和WiX DifX。我认为这些答案已经过时了。 Roadmap for Device and Driver Installation.
  • 感谢您的回答,B. Murri。看起来引导程序可能是最好的选择,我会尝试的。还要感谢 Stein 的投入,一如既往,您提供了知识和经验的最佳组合。
猜你喜欢
  • 2016-01-15
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
相关资源
最近更新 更多