奇数MSI组件规则

时间:2013-11-15 15:43:07

标签: windows installer windows-installer

我有一个安装程序,在安装时似乎没有遵循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的密钥路径版本并确定产品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组件根据是否要安装密钥路径安装了所有相关文件。什么可能导致与同一组件关联的每个文件被单独比较?

2 个答案:

答案 0 :(得分:1)

Keypath状态确定是否将对组件执行操作。然后,组件中的资源遵循其规则:例如,文件遵循file versioning rules

答案 1 :(得分:0)

假设每个产品都使用默认成本计算规则(OMUS),包含共享组件的合并模块应该可以使用。 FWIW,您可能需要考虑制作一个消耗此合并模块的MSI,然后将其添加到两个产品的引导程序中。补丁服务可以更加清洁。