2016-10-05 187 views
0

我有两个msi安装程序,一个用于使用InstallShield构建的产品A,另一个用于使用WiX构建的产品B.产品B应该在产品A的顶部运行,但最近一些代码X从B迁移到A.安装相同目录的多个msi安装程序

在全新安装中,不会出现问题。然而,让我们假设在服务器上安装了A.1和B.1(.1 =版本1),其中X通过B安装。假设我想安装A.2,它现在包含X.

代码X会被更新吗?如果我尝试卸载A.2或B.1,会发生什么情况?这是否允许?我怎样才能做到这一点?

+0

最大的问题是InstallShield安装是否是基于MSI的安装。这对答案有很大的影响。 – PhilDW

回答

0

这很大程度上取决于您没有说清楚的几件事情,所以让我们稍微介绍一下。我假设,从版本1开始,所有文件在安装程序之间是唯一的,或者是正确共享的,并且与您正在讨论的代码迁移无关(因此可以忽略此问题)。代码X在DLL之间迁移,例如,在代码X之间迁移。 A安装a.dll; B安装b.dll,并且代码正在从b.dll移动到a.dll

在这种情况下,假设两个产品之间没有调用链,那么您没有什么特别的做法。只需将A.2替换为下一个版本的A.dll,然后将B.dll替换为下一个版本。不需要担心安装顺序或DLL的多个所有权。

只要DLL版本允许DLL被正确替换,这种方法应该适用于任何类型的升级。

如果存在已发布的接口(如COM类),则可能需要更新的顺序以确保b.dll在a.dll接受它之前放弃注册引用,但是这些更改会违反组件规则。代码X的dll在安装程序之间迁移,例如,在安装程序之间迁移代码X的dll。 B安装c.dll,并且该DLL现在将由A

安装,在这种情况下,您的成功将取决于您的初始创作的质量。如果c.dll由其自己的组件安装并且被标记为共享,则可以将该组件添加到A(与其设置匹配),并且升级将按照任意顺序顺利进行。如果您先安装A.2,它将添加到引用计数中,因此安装B.2将不参考但不删除它。如果先安装B.2,它将暂时删除c.dll,但安装A.2将恢复它。卸载将以类似的方式工作,跟踪引用计数并在必要时删除。

但是这是假定进行重大升级。如果您正在使用次要升级(无论是以.msp还是.msi形式提供),那么情况会更加困难。为了使B的升级路径变得干净,它必须保持c.dll组件,并选择一种替代方法来删除c.dll。然而,我所知道的所有方法都与在同一地点安装相同组件的精确副本相冲突。对于这种情况,首先安装B.2应该可以工作,但是再安装它可能会删除c.dll。

如果次要升级可以正常工作,您可能还需要考虑卸载补丁的情况,但由于它们不能,因此我不会在这里介绍。