ICEM09
ICEM09 验证合并模块是否可以安全处理预定义的目录。 为此,它会验证模块中是否没有组件将某个目录安装到预定义的系统目录(例如“ProgramFilesFolder”或“StartMenuFolder”)。 相反,模块应使用具有唯一名称的目录(使用合并模块命名约定创建),并使用自定义操作来定位相应的目标目录。 此方法可以防止模块与最终数据库中的现有目录结构发生冲突。 ICEM09 将检查为正常使用此方法而所需的自定义操作是不存在(因此合并工具可以生成它们)还是以正确的形式存在(因此它们可按预期运行)。
无法修复 ICEM09 报告的警告或错误可能会导致合并模块的客户端出现问题。 包含主键的 Directory 表行(例如 ProgramFilesFolder)通常存在于数据库中;因此,如果模块中的组件直接安装到预定义的目录(例如 ProgramFilesFolder),则模块中的目录条目可能与现有的行冲突。 这种情况需要模块用户拆分模块中的源文件,以便与现有的源目录匹配。
当模块组件将某个目录安装到预定义的系统目录时,ICEM09 会报告错误或警告,导致可能与现有目录结构发生名称冲突。
ICEM09 针对包含所示数据库条目的模块发出以下警告。
Warning: The component 'Component1.<GUID>' installs directly into the pre-defined
directory 'ProgramFilesFolder'. It is recommended that merge modules alias
all such directories to unique names.
重命名合并模块目录,使其与 Windows Installer 属性不匹配,因此变成唯一的目录名称。 然后将同名属性设置为 Windows Installer 目录的值。 发生目录解析时,目录具有一个同名的属性,因此目录的安装位置是该属性的值。 文件从不同的源位置移动到相同的目标位置。 此过程应该可以完全消除合并冲突。
Warning: The 'ModuleInstallExecuteSequence' table contains a type 51 action
(StartMenuFolder.<GUID>) for a pre-defined directory, but this action
does not have sequence number '1'
如果操作的序号不是 1,则它可能不会在序列中足够早地合并到目标数据库,从而无法有效运行。
若要修复此警告,请将序号设置为 1。 请注意,大多数较新合并工具(而不是一些较旧版本)将在合并时生成这些自定义操作,因此并不始终需要在合并模块中显式创建这些操作。
Warning: The 'CustomAction' table contains a type 51 action (MyAppDataFolderAction)
for a pre-defined directory, but the name is not the same as the target directory.
Many merge tools will generate duplicate actions."
由于 CustomAction 列是 CustomAction 表的主键,某些合并工具可能因预先创建的操作名称不同而生成重复操作。
若要修复此警告,请将操作命名为与目标目录同名。 请注意,大多数较新合并工具(而不是一些较旧版本)在合并时生成这些自定义操作,因此并不始终需要在合并模块中显式创建这些操作。
目录 | Directory_Parent | DefaultDir |
---|---|---|
ProgramFilesFolder | Directory1 | A |
StartMenuFolder | Directory2 | B:C |
AppDataFolder | Directory3 | D |
MyPicturesFolder | Directory4 | E |
组件 | Directory |
---|---|
Component1.<GUID> | ProgramFilesFolder |
Component2.<GUID> | StartMenuFolder |
Component3.<GUID> | AppDataFolder |
Component4.<GUID> | MyPicturesFolder |
CustomAction | 类型 | 源 | 目标 |
---|---|---|---|
StartMenuFolder.<GUID> | 51 | StartMenuFolder.<GUID> | [StartMenuFolder] |
MyAppDataFolderAction | 51 | AppDataFolder.<GUID> | [AppDataFolder] |
ModuleInstallExecuteSequence 表
操作 | 序列 | BaseAction | 之后 | 条件 |
---|---|---|---|---|
StartMenuFolder.<GUID> | 100 |