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 表

目录 Directory_Parent DefaultDir
ProgramFilesFolder Directory1 A
StartMenuFolder Directory2 B:C
AppDataFolder Directory3 D
MyPicturesFolder Directory4 E

 

Component 表

组件 Directory
Component1.<GUID> ProgramFilesFolder
Component2.<GUID> StartMenuFolder
Component3.<GUID> AppDataFolder
Component4.<GUID> MyPicturesFolder

 

CustomAction 表

CustomAction 类型 目标
StartMenuFolder.<GUID> 51 StartMenuFolder.<GUID> [StartMenuFolder]
MyAppDataFolderAction 51 AppDataFolder.<GUID> [AppDataFolder]

 

ModuleInstallExecuteSequence 表

操作 序列 BaseAction 之后 条件
StartMenuFolder.<GUID> 100

 

合并模块 ICE 参考