【发布时间】:2013-11-15 15:43:07
【问题描述】:
我的安装程序在安装时似乎没有遵循 MSI 组件规则。这是场景:
操作系统:Windows 7 x64
产品 A 将一组附加到 guid 为“123ABC”的组件的文件安装到 C:\Program Files\Common Files\Foo。该组件具有以下文件:
foo.dll,版本 1.0.0.0,(KeyPath)
foo.sys,版本 1.0.0.0
foo.inf,没有版本
foo.cat,没有版本
产品 B 将附加到同一组件 guid“123ABC”的同一组文件安装到同一路径 C:\Program Files\Common Files\Foo。该组件具有以下文件:
foo.dll,版本 1.0.0.1,(KeyPath)
foo.sys,版本 1.0.0.0
foo.inf,没有版本
foo.cat,没有版本
先安装产品 A,产品 B 不执行产品 A 的升级,它们只是共享一个包含组件“123ABC”的公共 MSM。我的期望是,当安装产品 B 时,MSI 将比较 foo.dll 的 keypath 版本并确定产品 B 的 foo.dll 更新。然后与组件“123ABC”关联的所有四个文件将覆盖磁盘上由产品 A 安装的现有文件。这不会发生 :( 相反,这是生成的文件集:
C:\Program Files\Common Files\Foo
foo.dll,版本 1.0.0.1(来自产品 B)
foo.sys,版本 1.0.0.0(来自产品 A)
foo.inf,无版本(来自产品 A)
foo.cat,无版本(来自产品 B)
只有 dll 和 cat 文件被覆盖。从 msi 日志文件中,我可以看到以下内容:
MSI (s) (4C:F0) [17:29:24:227]: File: C:\Program Files\Common Files\Foo\foo.dll; Overwrite; Won't patch; Existing file is a lower version
MSI (s) (4C:F0) [17:29:24:305]: File: C:\Program Files\Common Files\Foo\foo.sys; Won't Overwrite; Won't patch; Existing file is of an equal version
MSI (s) (4C:F0) [17:29:24:305]: File: C:\Program Files\Common Files\Foo\foo.inf; Won't Overwrite; Won't patch; Existing file is unversioned and unmodified - hash matches source file
MSI (s) (4C:F0) [17:29:24:335]: File: C:\Program Files\Common Files\Foo\foo.cat; Overwrite; Won't patch; Existing file is unversioned and unmodified - hash doesn't match source file
我认为 MSI 组件根据是否要安装密钥路径来安装所有相关文件。什么会导致与同一组件关联的每个文件都被单独比较?
【问题讨论】:
-
将合并模块中的组件标记为共享并重新构建并重新测试。
-
你说的是msidbComponentAttributesShared还是msidbComponentAttributesSharedDllRefCount?无论哪种方式,我都看不到哪种设置会为我买单?此外,我们使用的是 MSI 3.0。
标签: windows installation windows-installer