WiX HowTo:在不重新安装的情况下降级第三方依赖项?
WiX HowTo: Downgrade a third-party dependency without re-installing?
背景
WiX 和 Windows 安装程序 对我来说是全新的。
在生产中,我们使用 MSI(使用 WiX 创建)来安装我们的软件。 MSI 引用第三方程序集(例如 OtherCompany.ThirdParty.dll,版本 2.5)。
我们软件的下一个版本必须引用旧版本的第三方程序集(例如OtherCompany.ThirdParty.dll,1.7 版)。
虽然我知道安装旧版本的依赖项并不常见,但它一定会发生。
所以我的问题是...您如何配置 MSI(由 WiX 生成)以使用旧版本的程序集而不必完全卸载现有包?
选项
我们探索了以下内容:
- 增加程序集的版本
- 它是第三方程序集,并且
- 对于可追溯性,这不是一个选项
- 重命名程序集
- 正在使用 NuGet 检索依赖关系...所以这不会很简单
- 强制完全删除现有安装(自动或手动)
- 我们不希望在之前的安装过程中收集的配置信息丢失,所以这不是一个选项
- 在计算成本之前安排
RemoveExistingProducts
- Microsoft 不推荐(参见:MSDN)
- 自定义操作:删除依赖项
- 如果安装失败,应用程序可能会处于未定义状态
- 在设置中覆盖文件版本
- 向前推进,这将容易出错
- 更改重新安装模式
- 从我读过的文章来看,这似乎只能作为最后的手段。
- 使用 WIX 配套文件
- 仍在调查中
对于版主
我知道还有其他关于此主题的 SO post。请注意,一些推荐的解决方案不完整或容易出错。
参考资料
- MSDN: Patching and Upgrades
- MSDN: RemoveExistingProducts Action
- downgrade a library during a msi upgrade
- Why Windows Installer removes files during a major upgrade if they go backwards in version numbers
- MSI Writing Guidelines
- What Every Developer Should Know About MSI Components
- Windows installer deletes versioned file during product upgrade, instead of downgrading it
- MSDN: Windows Installer - File Versioning Rules
- Msiexec REINSTALL=ALL REINSTALLMODE=vamus not reinstalling anything
- 很好地概述了幕后发生的事情
- Forcing an upgrade of a file that is modified during its initial installation
- 这是旧款 post 是 2009 年的
有些问题最好通过应用程序设计而不是部署来解决。
有两个地方可以保存特定版本的 .NET 程序集:GAC 或应用程序文件夹(或带有 probing privatePath). In either case, you might want to use a bindingRedirect 的子文件夹。
此外,您可以使用 AppDomain.AssemblyResolve 从特定位置加载,前提是使用 GAC 绑定不成功。
一般参考:How the Runtime Locates Assemblies—感谢@Pressacco。
背景
WiX 和 Windows 安装程序 对我来说是全新的。
在生产中,我们使用 MSI(使用 WiX 创建)来安装我们的软件。 MSI 引用第三方程序集(例如 OtherCompany.ThirdParty.dll,版本 2.5)。
我们软件的下一个版本必须引用旧版本的第三方程序集(例如OtherCompany.ThirdParty.dll,1.7 版)。
虽然我知道安装旧版本的依赖项并不常见,但它一定会发生。
所以我的问题是...您如何配置 MSI(由 WiX 生成)以使用旧版本的程序集而不必完全卸载现有包?
选项
我们探索了以下内容:
- 增加程序集的版本
- 它是第三方程序集,并且
- 对于可追溯性,这不是一个选项
- 重命名程序集
- 正在使用 NuGet 检索依赖关系...所以这不会很简单
- 强制完全删除现有安装(自动或手动)
- 我们不希望在之前的安装过程中收集的配置信息丢失,所以这不是一个选项
- 在计算成本之前安排
RemoveExistingProducts
- Microsoft 不推荐(参见:MSDN)
- 自定义操作:删除依赖项
- 如果安装失败,应用程序可能会处于未定义状态
- 在设置中覆盖文件版本
- 向前推进,这将容易出错
- 更改重新安装模式
- 从我读过的文章来看,这似乎只能作为最后的手段。
- 使用 WIX 配套文件
- 仍在调查中
对于版主
我知道还有其他关于此主题的 SO post。请注意,一些推荐的解决方案不完整或容易出错。
参考资料
- MSDN: Patching and Upgrades
- MSDN: RemoveExistingProducts Action
- downgrade a library during a msi upgrade
- Why Windows Installer removes files during a major upgrade if they go backwards in version numbers
- MSI Writing Guidelines
- What Every Developer Should Know About MSI Components
- Windows installer deletes versioned file during product upgrade, instead of downgrading it
- MSDN: Windows Installer - File Versioning Rules
- Msiexec REINSTALL=ALL REINSTALLMODE=vamus not reinstalling anything
- 很好地概述了幕后发生的事情
- Forcing an upgrade of a file that is modified during its initial installation
- 这是旧款 post 是 2009 年的
有些问题最好通过应用程序设计而不是部署来解决。
有两个地方可以保存特定版本的 .NET 程序集:GAC 或应用程序文件夹(或带有 probing privatePath). In either case, you might want to use a bindingRedirect 的子文件夹。
此外,您可以使用 AppDomain.AssemblyResolve 从特定位置加载,前提是使用 GAC 绑定不成功。
一般参考:How the Runtime Locates Assemblies—感谢@Pressacco。