我有一个 InstallShield InstallScript MSI 项目,其中包含 FLEXnet Connect ,没有Software Manager合并模块。该产品的版本是6.0.32。我为版本6.1创建了第二个安装程序,该安装程序还包含 FLEXnet Connect ,没有Software Manager合并模块。当我在包含6.0.32版本的系统上执行主要升级时,我在MSI日志中收到一条消息,说明:
Disallowing installation of component: {FF970098-B748-427B-B946-AA8E1A1F82AD} since the same component with higher versioned keyfile exists
该组件引用位于 FLEXnet Connect文件夹中的isusweb.dll
文件。
看起来此检查发生在6.0.32
产品被移除之前。安装将继续删除6.0.32
产品,该产品将删除isusweb.dll
。在6.1
安装期间,由于组件版本检查,isusweb.dll
未被放回。
升级成功。当我尝试从快捷方式运行应用程序时,它会验证组件。由于缺少isusweb.dll
MSI尝试修复,因此无法找到MSI并且不允许应用程序打开。
有没有办法让合并模块始终覆盖?
答案 0 :(得分:2)
这听起来像这个错误:
http://support.microsoft.com/kb/905238/en-us
我发现了这个错误,你确实看到了日志消息,而RemoveExistingProducts是安装的早期版本。它决定不根据存在的更高版本安装文件,但在REP删除之后不会重新评估该决定。然后,当您使用快捷方式时,修复将恢复它。该错误应仅适用于GAC或SxS中的文件,因此有点令人费解。
如果您可以在应该修复它的事务序列(InstallExecute,REP,InstallFinalize)结束时安排REP - 可能值得一试,此举的所有其他效果都可以。
答案 1 :(得分:2)
合并模块未安装,它们会合并。产品MSI已安装。使用第三方合并模块的一个问题是,如果他们有错误,你就无法做到这一点。
我考虑仅为了封装此MSM而创建MSI。然后,我创建一个安装先决条件或套件安装程序,以便在您的产品MSI之外安装此MSI。
答案 2 :(得分:2)
你已经有了两个非常好的答案,但尝试合成:
这听起来像是一个有缺陷的合并模块。 Phil 建议修复InstallExecuteSequence中的REP位置以解决此问题。 Chris 建议将错误的合并模块放在自己的设置中。我同意这两点,并认为你应该遵循这两个建议:
要使REP修复工作,您的组件引用必须100%正确 - 现在和将来。要消除此问题,创建单独设置的问题允许您将错误模块包含在其自己的MSI中。这将有助于您避免在将来错误地或通过更改设计重新激活错误 - 后者绝不可能。
正如Chris所说:合并模块未交付,它已合并。我所知道的所有人都可以使用更新的合并模块,但即使这样,包含它也是明智之举。特别是在处理GAC(全局程序集缓存)时。
答案 3 :(得分:0)
我遇到此错误时应用的另一个解决方案是设置为使用Orca在合并模块中从File表更新“Version”列。将其设置为最大65535.65535.65535.65535,这将强制升级始终从合并模块安装DLL。