使用WiX和C#管理依赖性地狱
作者:互联网
我们正处于产品发布的前夕,在最后一刻我被轰炸报告轰炸,这些报告似乎与我们的安装程序有关,这是一个WiX3项目,具有x86和x64版本的单独输出.这些一直是我一直认为固定的问题,只是为了发现它们仍在潜伏着.
产品本身是一组二进制文件,通过.Net远程处理相互通信,包括Windows服务和作为另一个应用程序中的插件加载的小型COM组件.该服务以SYSTEM身份运行,COM片段在低权限上下文中运行,而其他片段在普通用户上下文中运行.其他部分包括第三方COM对象库DLL和带.net Remoting接口的共享DLL.
我观察到MSI出现了奇怪的怪异行为,特别是在版本升级方面.在MS’肛门强名实现(具体来说,在加载给定程序集之前的确切版本检查)之间,记录了WiX / MSI错误,在升级时看到关键文件被删除(实质上,如果升级MSI中的文件具有相同的版本号作为现有安装,该文件被删除)(编辑:无法生成所述文档……),并且必须解决Wow64虚拟化问题(x86 MSI只能通过Wow64写入注册表/高清位置,但x64 MSI无法运行x86计算机…),我准备废弃整个东西并将其移植到不同的安装系统.
我正在寻找关于如何正确处理事情的技巧,技巧或建议,以便我不与Windows Installer扭曲的逻辑思维斗争.我厌倦了与WiX / MSI / Windows Installer的战斗.它需要做的就是将文件和注册表项放在我指定的位置,在适当的时候升级它们,并且在用户卸载之前不要删除任何内容.相反,依赖项会毫不犹豫地被删除,从而产生一大堆无法捕获的异常(无法围绕函数声明包装try {}块)和GPF整个应用程序.
我特别感兴趣的是关于共享和依赖DLL的“最佳实践”和示例,以及确保文件是否需要转到GAC的任何提示,它实际上是发送给GAC并保留在那里直到适合删除它.
谢谢!
汤姆
解决方法:
从The Definitive Guide to Windows Installer开始.
完成了吗?大.现在考虑废弃现有的安装,从头开始并为您当前在安装中“解决”的所有内容提交应用程序错误.对于你一直在努力的几乎每一个“扭曲逻辑”都是为了一个目的,使你的安装更可靠和可修复.
如果您不想要Windows Installer的可靠性和弹性,或者您试图以任何方式绕过它,那么请使用其他方法. Windows Installer做的远不止于“将文件和注册表项放在我告诉它的地方”.
在编写MSI包时,可以定义目标系统的外观.这就是它在设置后的样子,如果文件被删除或者密钥数据文件被破坏,它应该自动修复的方式.如果用户稍后在从1.0升级到2.0期间取消,则定义系统应如何回滚到的状态. Windows Installer是100%数据驱动的.从开发的角度来看,这是最难理解的概念,您不仅可以编辑配置文件或编写更多数据并期望它持续存在.一旦你了解了这一点,Windows Installer就变成了一块真正的蛋糕,你设计你的程序和功能是为了在它的限制内工作,而不是试图摆脱它们:)
一些其他有用的链接……
> Tao of the Windows Installer, Part 1
> Understanding UAC in MSI
标签:c,net,wix,windows-installer 来源: https://codeday.me/bug/20190701/1343112.html