如何不使用MSI项目在新建合并模块(.msm)中调用现有.msm合并模块
实现方案:无MSI项目依赖嵌套合并多个MSM文件
Windows Installer本身没有原生的MSM嵌套合并机制,但可以通过直接编辑新MSM的数据库表,把现有5个MSM的内容注入,全程只操作MSM项目/文件,不需要引入MSI工程,也不会产生对MSI项目的依赖。
操作步骤
步骤1:创建空白合并模块基础文件
- 用你常用的打包工具(WiX、InstallShield、或者直接用Orca创建)新建空白.msm项目,配置好基础的模块ID、版本、语言属性,确保和现有5个MSM的架构(32/64位)兼容。
步骤2:合并现有5个MSM的内容
两种实现方式可选,都不需要MSI项目参与:
方式一:WiX Toolset 脚本化实现(推荐,可复用)
- 先使用WiX自带的
heat.exe工具提取每个现有MSM的内容到独立的wxs代码片段,命令示例:
heat.exe merge 你的现有模块1路径.msm -out msm1.wxs heat.exe merge 你的现有模块2路径.msm -out msm2.wxs # 依次对剩下3个MSM执行相同命令生成对应wxs文件
- 把生成的所有wxs片段全部添加到你的新MSM项目的编译列表中,不需要做任何MSI相关配置,直接编译项目就能生成包含所有5个MSM完整内容的新合并模块。
方式二:Orca手动编辑实现(适合临时小批量操作)
- 用Orca打开你新建的空白MSM文件
- 依次打开每个现有MSM,把每个MSM中除了
_Validation、ModuleSignature之外的所有表的数据,逐表复制到新MSM的对应表中,新MSM没有的表直接新建即可 - 最后更新新MSM的
ModuleComponents表,把所有新增的组件ID都关联到你新MSM的模块ID上,保存后就是最终的合并MSM。
步骤3:依赖校验
生成新MSM后用Orca打开检查ModuleDependency表,确认没有任何指向MSI项目的依赖项,所有依赖都只指向系统自带合并模块或者你导入的5个MSM自带的依赖即可。
注意:如果原有5个MSM存在同名的组件、文件或者注册表项,需要提前做去重处理,避免合并时出现冲突,导致新的MSM无法正常被其他项目引用。
内容的提问来源于stack exchange,提问作者Somashekar
相关产品推荐
相关产品推荐

