该产品本身是一组二进制文件,通过 .Net 远程通信相互通信,包括一个 Windows 服务和一个作为其他应用程序插件加载的小型 COM 组件。服务以 SYSTEM 运行,COM 部分以低权限上下文运行,而其他部分以普通用户上下文运行。其他部分包括第三方 COM 对象库 DLL 和带有 .net Remoting 接口的共享 DLL。
我观察到 MSI 的行为非常奇怪,特别是在版本升级时。由于微软强名称实现的严格要求(具体来说,在加载给定程序集之前进行精确版本检查),WiX/MSI 存在一个已记录的 bug,会在升级时擦除关键文件(如果升级 MSI 中的文件与现有安装的版本号相同,则删除该文件)。此外还必须解决 Wow64 虚拟化的问题(x86 MSI 只能通过 Wow64 写入注册表/硬盘位置,而 x64 MSI 无法在 x86 计算机上运行...)。我已经准备放弃整个系统并将其移植到其他安装系统。
我正在寻找有关技巧、技术或建议的提示,以便正确地完成任务,避免与 Windows Installer 扭曲的逻辑作斗争。我已经厌倦了与 WiX/MSI/Windows Installer 的斗争。它所需要做的就是按照我的指示放置文件和注册表键,适当时升级它们,并在用户卸载之前不删除任何内容。但实际情况是,依赖项随意被删除,引发一系列无法捕获的异常(无法在函数声明周围包装 try{} 块),使整个应用程序崩溃。
我特别感兴趣的是有关共享和依赖 DLL 的最佳实践和示例,以及确保如果需要将文件放入 GAC,则确实将其放入 GAC 并在适当时删除它的任何提示。
谢谢!
Tom