【发布时间】: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