使用WiX和C#管理依赖性地狱

时间:2010-04-05 19:09:01

标签: c# .net wix windows-installer

我们正处于产品发布的前夕,在最后一刻我被轰炸报告轰炸,这些报告似乎与我们的安装程序有关,这是一个WiX3项目,具有x86和x64版本的独立输出。这些一直是我一直认为已经解决的问题,只是为了发现它们仍在潜伏着。

产品本身是一组二进制文件,它们通过.Net远程处理相互通信,包括Windows服务和在另一个应用程序中作为插件加载的小型COM组件。该服务以SYSTEM身份运行,COM片段在低权限上下文中运行,而其他片段在普通用户上下文中运行。其他部分包括第三方COM对象库DLL和带有.net远程接口的共享DLL。

我观察到MSI出现了奇怪的行为,特别是在版本升级方面。在MS'肛门强名实现(具体来说,在加载给定程序集之前的确切版本检查)之间,一个记录的WiX / MSI错误,它看到升级时删除了关键文件(实质上,如果升级MSI中的文件有与现有安装相同的版本号,该文件被删除)(编辑:无法生成所述文档......),并且必须解决Wow64虚拟化问题(x86 MSI只能通过Wow64写入注册表/高清位置但是x64 MSI无法在x86计算机上运行...),我准备废弃整个东西并将其移植到不同的安装系统。

我正在寻找有关如何正确执行操作的提示+技巧,技巧或建议,以便我不会与Windows Installer的扭曲逻辑斗争。我厌倦了与WiX / MSI / Windows Installer。它需要做的就是将文件和注册表项放在我指定的位置,在适当的时候升级它们,并且在用户卸载之前不要删除任何内容。相反,依赖项会毫不犹豫地被删除,从而产生一大堆无法捕获的异常(无法围绕函数声明包装try{}块)和GPF整个应用程序。

我对'最佳实践'和关于共享和依赖DLL的示例特别感兴趣,以及关于确保如果文件需要转到GAC的任何提示,它实际上去< / em>到GAC并留在那里直到适当删除它。

谢谢!

汤姆

3 个答案:

答案 0 :(得分:3)

首先阅读The Definitive Guide to Windows Installer

完成?大。现在考虑废弃现有的安装,从头开始并为您当前在安装中“解决”的所有内容提交应用程序错误。对于你一直在努力争取的几乎每一个“扭曲逻辑”都是为了一个目的,使你的安装更可靠和可修复。

如果您想要 Windows安装程序的可靠性和弹性,或者您试图以任何方式绕过它,那么请使用其他方法。 Windows Installer做的远远不止于“将文件和注册表项放在我告诉它的位置”。

当您编写MSI包时,您可以定义目标系统的外观。这就是它在设置后的样子,如果文件被删除或者密钥数据文件被破坏,它应该自动修复的方式。如果用户稍后在从1.0升级到2.0期间取消,则定义系统应如何回滚到的状态。 Windows Installer 100%数据驱动。从开发的角度来看,这是最难理解的概念,您不仅可以编辑配置文件或编写更多数据并期望它持续存在。一旦你了解了这一点,Windows Installer就变成了一块真正的蛋糕,你设计你的程序和功能,以便在它的限制内工作,而不是试图摆脱它们:)

其他一些有用的链接......

答案 1 :(得分:1)

假设您至少使用Wix 3.0,则可以使用MakeSfxCA.exe将依赖项打包到单个DLL中。 (这是DFT - Deployment Tools Foundation的一个加载项。)基本上,首先要确保项目正在复制依赖的DLL。制作CustomAction.config文件。使用简单的.bat文件进行测试,如:

REM MyMakeSfxCA.bat - 在$(TargetDir)下运行;腹肌。路径需要。 “%WIX%\ SDK \ MakeSfxCA”^     %cd%\ Managed_custom_action_pkg.dll ^     “%WIX%\ SDK \ x86 \ sfxca.dll”^     %cd%\ Managed_custom_action.dll ^     %cd%\ Dependent1.dll ^     %cd%\ Dependent2.dll ^     %cd%\ Microsoft.Web.Administration.dll ^     %cd%\ Microsoft.Deployment.WindowsInstaller.dll ^     %cd%\ CustomAction.config

一旦有效,转换为构建后事件: “$(WIX)\ SDK \ MakeSfxCA”^     $(TargetDir)\ Managed_custom_action_pkg.dll ^     “$(WIX)\ SDK \ x86 \ sfxca.dll”^     $(TargetDir)\ Managed_custom_action.dll ^     $(TargetDir)\ Dependent1.dll ^     $(TargetDir)\ Dependent2.dll ^     $(TargetDir)\ Microsoft.Web.Administration.dll ^     $(TargetDir)\ Microsoft.Deployment.WindowsInstaller.dll ^     $(TARGETDIR)\ CustomAction.config

在.wxs文件中,您的二进制密钥将如下所示: &LT; Binary Id =“Managed_custom_action_CA_dll”SourceFile =“$(var.Managed_custom_action.TargetDir)$(var.Managed_custom_action.TargetName)_pkg.dll”/&gt;

对于CustomAction.config,您可以在线查找示例,例如

这是我在使用托管代码时找到的最佳方式。

答案 2 :(得分:-1)

我有点害怕进入这个,但只有你没有遵循上游的最佳实践时才会有限制。

取“删除文件”“bug”。我有一段时间没见过这个,但如果我记得,这通常是由以下情况引起的:

构建A: 文件1:1.0.0.0

构建B: 文件1:1.0.0.0

现在,您可以在CostFinalize之后安排RemoveExistingProducts进行重大升级。 FindRelated Products检测到要删除的ProductCode,Costing说哦,我看到我有1.0.0.0但已经安装了1.0.0.0,所以我没有在这里做任何事情,然后RemoveExistingProducts来了并删除了旧版本,从而删除了file1。

我总是通过安排先前由Microsoft建议的RemoveEXistingProducts方式解决这个问题。它已经为我工作多年了。

至于依赖性地狱,我管理着一个软件产品线,其中包含数百个合并模块表达的数百个功能以及数十个安装程序在数十种不同功能,集成,主要,维护上消耗的数千个文件(15,000 +)和maintenance_integ分支。

我该怎么办?一次一个片段,自动化,SCM和虚拟机,以确保一切确实按照预期的方式工作。

接近您的产品运输,我能提供的唯一“答案”就是让您知道像我这样的人总是可以租用。你会惊讶于我们中的一些人能够快速转变项目并获得软件运输。