我有一个InstallShield InstallScript MSI项目,该项目包含FLEXnet Connect,但没有软件管理器合并模块。此产品的版本为6.0.32。我为6.1版创建了第二个安装程序,该安装程序还包含不带软件管理器合并模块的FLEXnet Connect。当我在包含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,并且不允许打开应用程序。
有没有办法让合并模块始终覆盖?
这听起来很像这个bug:
http://support.microsoft.com/kb/905238/en-us
我遇到了这个错误,您确实看到了日志消息,RemoveExistingProducts处于安装的早期。它决定不安装基于更高版本的文件,但在REP删除该文件后不会重新评估该决定。然后,当您使用快捷方式时,修复会恢复该文件。这个错误应该只适用于GAC或SxS中的文件,所以这有点令人费解。
如果您可以在事务序列(InstallExecute、REP、InstallFinalize)的末尾安排REP,它应该会修复它,那么可能值得一试,移动的所有其他效果都可以。
Merge模块不会被安装,而是被合并。产品MSI已安装。使用第三方合并模块的问题之一是,如果它们有错误,你就无能为力
我会考虑创建一个MSI只是为了封装这个MSM。然后我会创建一个安装prereq或套件安装程序来安装这个MSI,而不是你的产品MSI。
您已经得到了两个非常好的答案,但要尝试综合:
这听起来真的像一个有缺陷的合并模块Phil建议修复您在InstallExecuteSequence中的REP位置,以解决该错误Chris建议将有故障的合并模块放入自己的设置中。我同意两者,并认为你应该遵循这两个建议:
- 从主设置中删除合并模块
- 创建一个新的设置,添加有故障的合并模块,并确保REP顺序正确
要使REP修复程序正常工作,您的组件引用必须100%正确,无论是现在还是将来。为了将此问题作为一个问题来消除,创建单独的设置允许您将有缺陷的模块包含在其自己的MSI中。这将帮助您避免在未来错误地或通过更改设计重新激活错误,而后者永远不会发生。
正如Chris所说:合并模块不是交付的,而是合并的。据我所知,更新后的合并模块可能是可用的,但即使这样,包含它也是明智的。尤其是当你处理GAC(全局程序集缓存)时。
遇到此错误时,我应用的另一个解决方案是设置为使用Orca更新合并模块中File表中的"Version"列。将其设置为最大值65535.65535.65535.665535,这将强制升级始终从合并模块安装DLL。