我有两个msi安装程序,一个用于使用InstallShield构建的产品A,另一个用于使用WiX构建的产品B.产品B应该在产品A的顶部运行,但最近一些代码X从B迁移到A.
在全新安装中,不会出现任何问题。但是,让我们假设在服务器上安装了A.1和B.1(.1 =版本1),其中X是通过B安装的。让我们假设我要安装A.2 ,现在包含X.
代码X会更新吗?如果我尝试卸载A.2或B.1会发生什么?这是允许的吗?我怎样才能做到这一点?
答案 0 :(得分:0)
这在很大程度上取决于你没有说清楚的一些事情,所以让我们深入了解一下。我假设从版本1开始,所有文件在安装程序之间是唯一的,或者是正确共享的,并且与您正在谈论的迁移代码无关(因此可以忽略此问题)。
案例1:代码X在DLL之间迁移,例如A安装a.dll; B安装b.dll,代码从b.dll移动到a.dll
在这种情况下,假设这两种产品之间没有呼叫链,那么您没有什么特别的事情可做。只需要A.2用下一个版本替换a.dll,B.2用下一个版本替换b.dll。不关心安装顺序或DLL的多个所有权。
这种方法适用于任何类型的升级,只要DLL版本控制允许正确替换DLL。
如果存在已发布的接口(例如COM类),则可能需要更新所需的顺序,以确保b.dll在a.dll接受之前放弃注册引用,但这些更改违反了组件规则
案例2:代码X的dll在安装程序之间迁移,例如B安装c.dll,现在该DLL将由A
安装在这种情况下,您的成功取决于初始创作的质量。如果c.dll由其自己的组件安装并标记为shared,则可以将该组件添加到A(与其设置匹配),并且升级将以任一顺序平稳运行。如果先安装A.2,它将添加到引用计数,因此安装B.2将取消引用但不删除它。如果先安装B.2,它将暂时删除c.dll,但安装A.2将恢复它。卸载将类似地工作,跟踪引用计数并根据需要删除。
但这是一次重大升级。如果您正在使用次要升级(无论是以.msp还是.msi格式发布),那么您将面临更加困难的情况。要使B的升级路径干净,它必须保留c.dll组件并选择一种替代方法来删除c.dll。但是,我所知道的所有方法都与A相冲突,在同一个地方安装了同一组件的精确副本。对于这种情况,首先安装B.2应该可以工作,但是安装它可能会删除c.dll。
如果次要升级可以正常运行,您可能还必须考虑卸载补丁的情况,但由于它们不能,我在这里不会覆盖。