WiX HowTo:在不重新安装的情况下降级第三方依赖项?

WiX HowTo: Downgrade a third-party dependency without re-installing?

背景

WiXWindows 安装程序 对我来说是全新的。

在生产中,我们使用 MSI(使用 WiX 创建)来安装我们的软件。 MSI 引用第三方程序集(例如 OtherCompany.ThirdParty.dll,版本 2.5)。

我们软件的下一个版本必须引用旧版本的第三方程序集(例如OtherCompany.ThirdParty.dll,1.7 版)。

虽然我知道安装旧版本的依赖项并不常见,但它一定会发生。

所以我的问题是...您如何配置 MSI(由 WiX 生成)以使用旧版本的程序集而不必完全卸载现有包?

选项

我们探索了以下内容:

  1. 增加程序集的版本
    • 它是第三方程序集,并且
    • 对于可追溯性,这不是一个选项
  2. 重命名程序集
    • 正在使用 NuGet 检索依赖关系...所以这不会很简单
  3. 强制完全删除现有安装(自动或手动)
    • 我们不希望在之前的安装过程中收集的配置信息丢失,所以这不是一个选项
  4. 在计算成本之前安排 RemoveExistingProducts
    • Microsoft 不推荐(参见:MSDN
  5. 自定义操作:删除依赖项
    • 如果安装失败,应用程序可能会处于未定义状态
  6. 在设置中覆盖文件版本
    • 向前推进,这将容易出错
  7. 更改重新安装模式
    • 从我读过的文章来看,这似乎只能作为最后的手段。
  8. 使用 WIX 配套文件
    • 仍在调查中

对于版主

我知道还有其他关于此主题的 SO post。请注意,一些推荐的解决方案不完整或容易出错。

参考资料

有些问题最好通过应用程序设计而不是部署来解决。

有两个地方可以保存特定版本的 .NET 程序集:GAC 或应用程序文件夹(或带有 probing privatePath). In either case, you might want to use a bindingRedirect 的子文件夹。

此外,您可以使用 AppDomain.AssemblyResolve 从特定位置加载,前提是使用 GAC 绑定不成功。

一般参考:How the Runtime Locates Assemblies—感谢@Pressacco。