WIX将新文件添加到共享组件

时间:2009-03-31 22:38:29

标签: .net wix windows-installer

我有一个共享的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卸载删除(它在最初安装时在组件中不存在)。

我还有其他选择吗?

由于

5 个答案:

答案 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 文件中的多个产品可能共享相同的升级代码,从而避免冲突情况。