Installation 主要升级期间合并模块安装失败

Installation 主要升级期间合并模块安装失败,installation,windows-installer,installshield,merge-module,Installation,Windows Installer,Installshield,Merge Module,我有一个InstallShield InstallScript MSI项目,其中包含不带软件管理器合并模块的FLEXnet Connect。此产品的版本为6.0.32。我为6.1版创建了第二个安装程序,其中还包含不带软件管理器合并模块的FLEXnet Connect。当我在包含6.0.32版本的系统上执行主要升级时,我会在MSI日志中收到一条消息,说明: Disallowing installation of component: {FF970098-B748-427B-B946-AA8E1A1

我有一个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:

我遇到了这个bug,您确实看到了日志消息,RemoveExistingProducts在安装的早期。它根据存在的更高版本决定不安装该文件,但在代表删除该文件后不会重新评估该决定。然后,当您使用快捷方式时,修复会将其恢复。这个bug应该只适用于GAC或SxS中的文件,所以这有点令人费解


如果您可以在事务序列(InstallExecute、REP、InstallFinalize)的末尾安排REP,那么应该可以修复它-可能值得一试,移动的所有其他效果都可以

这听起来很像这个bug:

我遇到了这个bug,您确实看到了日志消息,RemoveExistingProducts在安装的早期。它根据存在的更高版本决定不安装该文件,但在代表删除该文件后不会重新评估该决定。然后,当您使用快捷方式时,修复会将其恢复。这个bug应该只适用于GAC或SxS中的文件,所以这有点令人费解


如果您可以在事务序列(InstallExecute、REP、InstallFinalize)的末尾安排REP,那么应该可以修复它-可能值得一试,移动的所有其他效果都可以

合并模块不会被安装,而是被合并。安装产品MSI。使用第三方合并模块的一个问题是,如果它们有bug,您就无能为力


我会考虑仅仅为了封装这个MSM而创建MSI。然后我会创建一个setup prereq或suite安装程序,将此MSI与产品MSI分开安装。

合并模块不会安装,它们会合并。安装产品MSI。使用第三方合并模块的一个问题是,如果它们有bug,您就无能为力


我会考虑仅仅为了封装这个MSM而创建MSI。然后,我会创建一个setup prereq或suite安装程序,在您的产品MSI之外安装此MSI。

您已经得到了两个非常好的答案,但要尝试并综合:

这听起来像是一个有缺陷的合并模块Phil建议修复您在InstallExecuteSequence中的销售代表位置,以解决该漏洞Chris建议将出现故障的合并模块置于其自身设置中。我同意这两种观点,并认为您应该遵循这两种建议:

  • 从主设置中删除合并模块
  • 创建一个新的设置,添加有故障的合并模块,并确保正确的REP顺序
要使REP修复程序正常工作,您的组件引用必须100%正确-无论是现在还是将来。为了消除这一问题,创建一个单独的设置允许您在其自己的MSI中包含buggy模块。这将帮助您避免在将来因错误或更改设计而重新激活该bug,而后者是不可能的


正如Chris所说:合并模块不是交付的,而是合并的。据我所知,一个更新的合并模块可能是可用的,但即使如此,包含它也是明智的。特别是当您处理GAC(全局程序集缓存)时。

您已经得到了两个非常好的答案,但要尝试并综合:

这听起来像是一个有缺陷的合并模块Phil建议修复您在InstallExecuteSequence中的销售代表位置,以解决该漏洞Chris建议将出现故障的合并模块置于其自身设置中。我同意这两种观点,并认为您应该遵循这两种建议:

  • 从主设置中删除合并模块
  • 创建一个新的设置,添加有故障的合并模块,并确保正确的REP顺序
要使REP修复程序正常工作,您的组件引用必须100%正确-无论是现在还是将来。为了消除这一问题,创建一个单独的设置允许您在其自己的MSI中包含buggy模块。这将帮助您避免在将来因错误或更改设计而重新激活该bug,而后者是不可能的


正如Chris所说:合并模块不是交付的,而是合并的。据我所知,一个更新的合并模块可能是可用的,但即使如此,包含它也是明智的。特别是在处理GAC(全局程序集缓存)时。

遇到此错误时,我应用的另一个解决方案是使用Orca从合并模块中的文件表中更新“版本”列。将其设置为最大值65535.65535.65535.65535,这将强制升级始终从合并模块安装DLL。

我遇到此错误时应用的另一个解决方案是将其设置为从合并模块中的文件表更新“版本”列