我有一个共享的dll,我们称之为由多个产品安装的Utility.dll。在我的WIX文件中,我将Utility.dll作为单独的组件安装。现在,Utility.dll 2.0版引用了一个额外的DLL,UtilityUtility.dll,需要同时安装。
首次尝试集成UtilityUtility.dll时,我创建了一个包含新dll的新WIX组件。
这会导致以下情况出现问题
1)用户安装产品1 {Utility.dll 1.0}
2)用户安装产品2 {Utility.dll 2.0,UtilityUtility.dll 2.0}
3)用户卸载产品2 {Utility.dll 2.0}
现在,当用户使用Utility.dll时,如果找不到引用的UtilityUtility.dll
,它将失败这导致我将UtilityUtility.dll添加到原始组件,这会阻止在前一个场景中删除UtilityUtility.dll,但是它有自己的问题。
1)用户安装产品1 {Utility.dll 1.0}
2)用户安装产品2 {Utility.dll 2.0,UtilityUtility.dll 2.0}
3)用户卸载产品2 {Utility.dll 2.0,UtilityUtility.dll 2.0}
4)用户卸载产品1 {UtilityUtility.dll 2.0}
UtilityUtility.dll是孤立的,因为它不会被产品1卸载删除(它在最初安装时在组件中不存在)。
我还有其他选择吗?
由于
答案 0 :(得分:3)
除非你能更新产品1(我认为这是不可能完全可能的),否则我认为你被搞砸了。恕我直言,组件规则是Windows Installer最糟糕的事情。这个link to an old blog post of mine总结了大部分内容。你的情况与那里描述的有点不同,但结果是预期的。
我认为你可以选择两个邪恶中较小的一个。
答案 1 :(得分:1)
我不是100%肯定......但我认为将第二个.DLL添加到原始组件可能是对组件规则的“违反”。看看:http://blogs.msdn.com/robmen/archive/2003/10/18/56497.aspx
从我从Wix人群中收集的内容来看,领先的“最佳实践”是将每个文件作为单独的组件。
您的升级计划是什么(以msi术语:主要,次要,补丁)?如果我没记错的话,不允许对组件定义进行小的升级。不知道补丁。
您可能还想担心修复。
答案 2 :(得分:0)
你能重现第二个问题吗? 理论上,在安装Product 2组件后,版本变为2.0。在第3步之后,组件版本仍为2.0。当用户在步骤4中卸载产品1时,Windows Installer知道如何删除Utility.dll 2.0和UtilityUtility.dll 2.0。
更新:我错了,抱歉。
答案 3 :(得分:0)
我自己遇到过这个问题。我同意@rbobby并且我进一步提出,您可以设想这个破坏的用户场景的事实证明您违反了规则。只有在完全兼容的情况下,才应更新共享组件。如果Duck 2.0没有嘎嘎叫或游泳,请为它填一个新名称。
在您的情况下,您有Utility.dll 1.0和Utility.dll 2.0,但它们只是“相同的组件”,因为它们以不同的方式执行类似的操作。 Utility.dll 2.0应该真的称为UtilityPlus.dll 1.0。
抱歉,我知道这可能不是你想听的答案,但工程案例很清楚。
答案 4 :(得分:0)
这是很久以前的事了,但现在有同样的问题。是否有对所有相关产品使用相同 UpgradeGUID 的可能解决方案? MSDN上的文档说
<块引用>UpgradeCode 属性是一个 GUID,表示一组相关的 产品。 UpgradeCode 用于在升级表中搜索 已安装产品的相关版本
这听起来像是不同 MSI 文件中的多个产品可能共享相同的升级代码,从而避免冲突情况。