简介:Advanced Installer 20.7.1 软件打包工具资源,定位为 Windows Installer(MSI)安装包制作与自定义界面部署场景,适合软件开发者、打包工程师及需要输出规范化安装包的团队使用。工具提供图形化向导,可快速生成符合 MS Windows 认证的 MSI 包,并支持自定义欢迎界面、安装进度和卸载流程,有效降低手工编辑安装配置的复杂度。资源共 2000 个文件,核心为 aip 工程文件(419 个),配套 png(669 个)、jpg、bmp、ico 等界面与图标素材,以及 xsd 配置定义、rtf 说明文档、xml 多语言资源、html 帮助页面等,覆盖打包配置、界面视觉、多语言文本和组件规则等环节,压缩包整体约 161MB。目前已有 944 人学习关注。借助这份资源,可对照工程文件掌握 Advanced Installer 的目录结构与常用配置写法,也能直接取用桌面图标、安装背景和语言资源优化自己的安装程序,对搭建打包工程、处理安装界面定制需求有实际帮助。
1. 打包工具选型这件事,为什么值得先花二十分钟想清楚
做 Windows 桌面软件分发的同学,早晚会遇到同一个问题:程序编出来了,交付却卡在“装不上、装不干净、卸载留垃圾”这三座大山上。Advanced Installer 20.7.1 这类软件打包工具解决的就是这一整段“从编译产物到用户机器上能跑、能升、能卸”的工程问题。它能把 exe、dll、配置文件、服务、驱动、注册表项、快捷方式这些零散资源,统一收编成 MSI、EXE、MSIX 等标准安装包,并管住安装、升级、修复、卸载全生命周期。20.7.1 这个版本在界面响应、MSIX 打包流程和命令行构建上都有可感知的改动,对做企业软件分发、内部工具交付、硬件配套软件出厂的工程师来说,属于值得跟进的小版本。
适合读这篇的,不是第一次接触安装包概念的新手,而是已经能编出 Release 版本、但还不确定怎么把它体面地交给用户的开发者、运维和产品交付同事。下面这套流程不是照抄官方教程,而是把一个打包任务从头到尾拆开,告诉你每个步骤背后的判断依据,以及真正会让你半夜爬起来看日志的那些坑。
2. 为什么选择 Advanced Installer 而不是其他方案:主流打包形态的选型对照
2.1 三种常见打包路线:脚本安装、MSI、MSIX 的边界在哪里
先把概念理顺。脚本安装(Inno Setup、NSIS 这类)本质是一段安装程序,把文件拷贝到目标路径、写注册表、建快捷方式,优点是轻量、灵活、上手快,缺点是卸载逻辑基本靠脚本自己写,装到一半失败很难回滚,企业批量分发时静默参数各家不统一。MSI 走的是 Windows Installer 引擎,由系统级的 msiexec 调度安装事务,具备安装、修复、卸载的完整状态机,适合需要大规模部署、版本管理、集中管控的场景。MSIX 是微软主推的新容器格式,权限控制严格,支持增量更新和按用户安装,但要求运行在较新版本的 Windows 上,对传统驱动、系统服务的支持成熟度不如 MSI。
Advanced Installer 在选型里的位置,是它同时覆盖了这三条路线:传统桌面软件用它做 MSI 和 EXE 很方便;需要上 MSIX 时不用换工具链,直接建一个 MSIX 项目重新组织资源即可。这一点在实际项目里意义很大——我见过某公司为了配合 Windows 11 的政策要求,把一个老软件从 Inno Setup 迁移到 MSIX,结果因为公司自有签名证书链不受系统信任,折腾了两周才搞明白,而 Advanced Installer 可以直接复用已有证书,少踩很多基础坑。
2.2 用 20.7.1 建一个 MSI 安装包:从产品名到文件树的完整项目骨架
下面这段操作把最核心的路径走通。打开 Advanced Installer 20.7.1,新建项目时选择“企业版”里的 MSI 项目模板,然后按以下步骤建立骨架。这里用命令行构建的方式演示,方便你把它接进 CI 流程。
# 进入 Advanced Installer 安装目录(默认路径示例,按实际安装位置调整) cd "C:\Program Files (x86)\Caphyon\Advanced Installer 20.7.1\bin\x86" # 用命令行构建已保存的 .aip 项目文件 AdvancedInstaller.com /build MyApp.aip -buildslist # 指定输出路径并生成 MSI AdvancedInstaller.com /build MyApp.aip -out "D:\build_output\MyApp_1.0.0.msi"/build是主命令,后面跟项目文件路径;-buildslist先列出项目里配置好的所有构建配置,方便你确认当前默认用的是 Release 还是 Debug 配置;-out指定最终 MSI 的输出位置。如果你配了多个发布渠道(比如企业版和社区版两个安装包差异很大),可以在项目里建两条构建配置,命令行里通过-buildname参数指定跑哪条。20.7.1 的构建速度相比旧版有优化,但如果你同时在构建虚拟机里跑杀毒扫描,输出时间会被明显拖长。
2.3 项目里必须先配好的四个基础维度:产品信息、升级码、图标、安装权限
这四个维度是任何 MSI 安装包的“身份四件套”,一个都没配好,后面轻则升级失败,重则卸载后系统残留半个软件。
| 配置项 | 在哪里设置 | 作用与典型失败场景 |
|---|---|---|
| Product Name + Version | 产品详情页 | 系统“程序和功能”里显示的名称和版本,和快捷方式版本对不上会引发支持工单 |
| Upgrade Code | 升级页面 | 一个产品家族的固定 GUID,不能每次发版都重新生成,否则旧版本永远卸载不掉 |
| 图标 | 产品详情页 → 图标组 | 控制快捷方式和控制面板显示图标,格式必须是 .ico 且包含适当分辨率,否则显示模糊 |
| 安装权限 | 启动条件页面 | 决定是否需要管理员权限,需要写 Program Files 就得设管理员,否则安装到一半报错 1721 |
升级码是这里面最容易被忽视的,特指这个场景:产品 1.0 你生成了一个 GUID,开发到 1.1 时为了“干净”又换了一个新的。结果用户机器上 1.0 和 1.1 共存,控制面板里出现两个条目,卸载其中一个把共享组件也带走,另一个就启动报错。正确做法是:同一个产品线永远保持同一个升级码,只提升版本号和文件版本。
3. 用 20.7.1 把桌面软件打成 MSI:从文件、注册表到快捷方式的完整排布
3.1 文件和文件夹这一层:搞懂“目标机器上的路径”而不是“源文件路径”
在 Advanced Installer 的“文件与文件夹”页面里,左侧显示的是源目录结构(你本机编译输出的目录),右侧是目标目录结构(软件装到用户机器上的位置)。很多人第一次上手会把两侧搞混:在源目录里放了文件,以为就是装到用户那里了,实际只是引用。右侧目标目录的根节点代表“安装根目录”,默认叫INSTALLDIR,不要把文件直接塞在根节点下,而是按软件惯例建Program Files\公司名\产品名结构。如果软件是 64 位程序,注意目标文件夹要选64-bit,否则文件会被 Windows Installer 重定向到C:\Program Files (x86)下面,运行时报找不到 DLL 的概率极高。
实际操作里我习惯用环境变量来定位目标路径,而不是写死。比如用户的 AppData 目录在不同机器上差异很大,写死C:\Users\xxx\AppData根本没法分发。正确的做法是在目标文件夹里选择Folder Properties,用[LocalAppDataFolder]或[AppDataFolder]这类系统属性占位符,安装时 Windows Installer 会替换成当前用户的真实路径。
3.2 注册表项怎么写才不会把系统搞乱:六类常用键的配置清单
注册表配置界面支持从现有注册表导入,也支持手动新建。对桌面软件来说,常见的注册表写入场景有这么几类:
| 注册表用途 | 示例路径 | 写入时机 | 卸载时处理 |
|---|---|---|---|
| 文件关联 | HKEY_CLASSES_ROOT.myfile | 安装时 | 自动删除 |
| 当前用户配置 | HKEY_CURRENT_USER\Software\MyApp | 安装时 | 自动删除 |
| 开机自启 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run | 安装时 | 需要特别指定删除 |
| 程序设置默认值 | HKEY_LOCAL_MACHINE\SOFTWARE\MyCompany\MyApp | 安装时 | 保留用户修改过的值 |
| 协议处理器 | HKEY_CLASSES_ROOT\myproto | 安装时 | 自动删除 |
| 卸载信息 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall | 由 MSI 自动管理 | 由 MSI 自动管理 |
第一类文件关联的操作很容易让新手跌跟头:在 Advanced Installer 里选择“导入注册表文件”时,如果目标 .reg 文件里的路径是写死的绝对路径,导入后会原样写入,到别的机器上就失效。正确做法是在导入后逐条检查,把路径里的绝对部分改成[INSTALLDIR]或系统属性占位符。这个习惯对后来维护特别重要。
3.3 快捷方式、服务、COM 组件的注册:这几类资源的注册逻辑要分清
快捷方式在“快捷方式”页面统一管理,可以建在桌面、开始菜单、启动文件夹任一位置。注意“启动文件夹”和“服务”不是一回事:前者是开机后以当前用户身份运行的程序,后者是系统级后台服务,可以在“服务”页面里注册。如果你的软件包含 Windows 服务,需要在服务页面指定服务名、显示名、启动类型(自动/手动/禁用),以及在“服务依赖”里声明这台机器上必须先装好的其他服务。COM 组件注册则要回到“COM 对象”页面,把 dll 的 CLSID、ProgID、线程模型这些信息逐条填对,或者直接让工具从注册表快照里捕获。
桌面快捷方式有一个常见要求是“安装后立即出现,但用户可以删,下次升级时不强制恢复”。这个在 Advanced Installer 里不需要额外做任何事情,MSI 自带这个语义:快捷方式是每用户安装的一部分,用户删除后不会在升级时被强行拉回来。反倒是如果你用了“启动条件”里的自定义检查,发现用户处于某种状态就拒绝安装,导致用户没法升级到新版本,那个是真正的连环坑。
3.4 一个需要静默安装的企业分发场景:msiexec 参数全解析
企业 IT 做软件分发时,几乎不会手动点安装向导,而是把 MSI 推送到每台机器上,用命令模式静默安装。下面是把刚才打包好的 MSI 推出去的完整命令行,以及每个参数的职业级解释。
# 基本静默安装,不显示任何 UI msiexec /i "MyApp_1.0.0.msi" /qn /norestart # 带日志输出的企业级静默安装 msiexec /i "MyApp_1.0.0.msi" /qn /norestart /l*v "C:\Windows\Temp\MyApp_install.log" # 覆盖安装属性,指定安装目录和关闭某个功能组件 msiexec /i "MyApp_1.0.0.msi" /qn /norestart INSTALLDIR="D:\MyApp" FEATURE_X_DISABLED=1/qn表示完全无 UI,安装过程中用户不会看到任何对话框;/norestart抑制安装完成后的强制重启,避免影响用户正在编辑的文档;/l*v打开详细日志,记录每一个安装动作和系统调用的返回值。第三个命令里的INSTALLDIR是 MSI 内置的目录属性,可以覆盖默认安装路径,FEATURE_X_DISABLED是你在 Advanced Installer 里自定义的功能开关属性,部署时可以不重新打包就控制装哪些组件。对这类静默安装排障时,日志里最需要注意的行是Return value 3(安装被用户取消)、Return value 1603(致命错误)和Return value 1619(安装包本身有问题)。遇到 1603,我一般直接看最后几十行日志里的MSI (s) (...): Product: MyApp -- Installation failed前面的错误码,比看整篇日志高效得多。
4. 打 EXE 引导包与 MSIX:什么时候用,各自的门槛在哪里
4.1 EXE 引导包的适用场景:有前置依赖、需要下载运行时、需要管理员权限
MSI 在纯 Windows Installer 环境下是标准答案,但软件有前置依赖时就用不上——比如程序依赖某个版本的 .NET Framework,目标机器上没有,MSI 自己不会去下载,只会报一个“找不到组件”的错误。这时需要 EXE 引导包(Bootstrapper):它先检查前置条件,不满足就静默下载并安装,然后才开始执行内部的 MSI 安装步骤。
在 Advanced Installer 里建 EXE 引导项目时,重点配置两块:前置条件(Prerequisites)列表和下载源。前置条件包括 .NET Framework、VC++ Redistributable、DirectX 等常见运行时;下载源可以指到微软官方链接,也可以打包到引导包内部。企业内网部署时我通常选择“打包到内部”,避免终端机器访问外网下载受策略限制——但注意这样 EXE 体积会明显变大,对动辄几百 MB 的软件来说,一个可执行文件携带所有运行时会让分发平台上传超时,需要平衡。
4.2 EXE 引导包与 MSI 在安装行为上的差异:三个值得注意的边界
EXE 引导包执行一次安装,会依次完成“检查 → 下载前置 → 安装前置 → 执行 MSI → 显示完成”,全部都在同一个进程树里。但它的卸载行为并不自动等同于卸载 MSI:如果用户在控制面板里卸载的是“MyApp”这个 MSI 条目,前置依赖(比如 VC++ Redistributable)不会被连带卸载。我第一次做这种包时默认了会连卸,结果用户卸载后系统里残留两三个运行时,第二次安装时版本冲突,折腾了半下午。现在的习惯是:引导包里如果装了前置依赖,要在打包文档里明确写清“卸载时保留哪些、清理哪些”,并且建议不要卸载公用的 VC++ 运行时——别的软件可能正在用它。
MSIX 的差异更突出。MSIX 安装包在系统层面走“打包应用”通道,文件签名和证书验证规则严格很多;未加入受信任列表的证书即使安装在本地,也会被判断为“不受信任的来源”。在 20.7.1 里把项目切换成 MSIX 构建时,首件事就是检查证书是否受目标机器信任,否则打包出来的 MSIX 只能本地调试用,分发出去大概率被拦。
4.3 从 MSI 项目克隆成 MSIX:分钟级切换,但有一个前提
Advanced Installer 的一个实用功能是可以在项目里新建 MSIX 构建配置,不必单独建项目。在“构建”页面添加一个 MSIX 配置,它会自动沿用原来的文件、注册表、快捷方式配置。这里有一个很容易忽略的前提:注册表项依赖的路径类型不一样。MSIX 安装运行在应用容器里,写注册表需要走注册表虚拟化路径,而传统 MSI 写的是 HKEY_LOCAL_MACHINE 实路径。如果在 MSIX 配置里保留了为 MSI 准备的注册表项,安装会成功,但运行时会读不到配置。我一般会为 MSIX 单独维护一套注册表配置,用“注册表视图”里的目标根键区分——MSI 用HKEY_LOCAL_MACHINE\SOFTWARE,MSIX 用HKEY_CURRENT_USER\Software\Classes\...,按平台隔离不混用。
5. 打包过程的避坑手册:五个我亲手撞过且必须写下来的坑
5.1 现象:安装后右键菜单的“以管理员身份运行”选项消失
| 项 | 内容 |
|---|---|
| 现象 | 软件装在 Program Files 下,普通用户双击可以启动,但右键菜单里没有“以管理员身份运行”,提权操作只能从任务管理器里做 |
| 原因 | 快捷方式设置页里勾选了“以管理员身份运行”选项,取消勾选后快捷方式被重建,权限属性丢失 |
| 解决 | 如果软件确实需要管理员权限正常运行,不要依赖快捷方式层面,改用在“启动条件”里配置“要求管理员权限”。这样安装时 MSI 会强制 UAC 提权,快捷方式层面保持普通属性即可 |
这个坑的判断逻辑是:快捷方式的“以管理员身份运行”是一次性属性,很多卸载修复流程会重建快捷方式,属性就没了。从启动条件层面增加硬性要求,所有入口统一提权,不依赖快捷方式的个性设置。
5.2 现象:升级安装后旧版本功能还在,文件却显示新旧混用
| 项 | 内容 |
|---|---|
| 现象 | 从 1.0 升级到 1.1,部分 DLL 还是旧版本号,程序运行出现既有新特性又有老逻辑的“杂交状态” |
| 原因 | 文件版本号比旧版本低,Windows Installer 的版本规则决定它不会覆盖已存在的同路径同名文件 |
| 解决 | 每次发版前在“文件与文件夹”页面右键看文件版本,确保所有被安装文件的版本号高于当前已发布版本。工具自身不会帮你对比线上版本,必须自己维护版本比较 |
这里有两条可操作的经验:第一,所有 DLL 的版本号要和安装包版本号同步递增,除非这个 DLL 明确不需要更新;第二,实在有不想覆盖的 DLL,在“文件”属性里勾选“永不覆盖”,但这是应急手段,正常发版不建议用。版本不齐是我见过最多的企业软件“升级后静默异常”来源。
5.3 现象:卸载软件后,注册表里还能找到安装时的路径值
| 项 | 内容 |
|---|---|
| 现象 | 软件卸载干净了,但HKEY_LOCAL_MACHINE\SOFTWARE\...\InstallPath还在,个别机器上还能指到已经删除的目录 |
| 原因 | 注册表页里写入的项没有标记为“卸载时删除”,默认策略在某些场景下会保留部分值 |
| 解决 | 在注册表页里逐条检查键值的“卸载行为”,需要清理的项选择“迁移/删除”,不需要清理的项(比如用户配置)保留就行。批量处理时用“注册表搜索”按路径筛选,一键修改 |
5.4 现象:静默安装参数传了但没生效,安装路径还是默认值
| 项 | 内容 |
|---|---|
| 现象 | 命令行里写了INSTALLDIR="D:\CustomPath",实际安装完还是C:\Program Files\... |
| 原因 | 项目里把安装目录属性设成了不可覆盖,或属性名拼写与 MSI 里的属性定义不一致 |
| 解决 | 在 Advanced Installer 的“属性”页面里找到INSTALLDIR,确认“公共属性”选项已勾选,且没有用“受保护属性”锁住。命令行传参时,属性名要严格一致,大小写敏感 |
这条命令在部署脚本里报错概率很高,排错方法是看安装日志里的Property(S): INSTALLDIR = D:\CustomPath这一行是否出现,如果没出现,说明属性名不匹配,出现在这里的值才是 MSI 实际收到的。
5.5 现象:MSIX 打包签名后提示“无法验证此程序包的发布者”
| 项 | 内容 |
|---|---|
| 现象 | MSIX 已经用公司证书签名,在部分用户机器上安装时提示发布者无法验证 |
| 原因 | 证书链不完整。根证书和中间证书没有打包进 MSIX 包,或者目标机器上没有安装根证书 |
| 解决 | 在“数字签名”页双击证书项,勾选“将证书链添加到包中”,同时在部署文档里写明:企业域内机器需要由 IT 统一推送根证书到“受信任的根证书颁发机构”存储区 |
这条对做企业内部工具分发的场景特别常见。注意自签名证书在开发者模式下的表现和有完整链的商业证书完全不同,前者只适合极少数内部调试机器,正式分发不要依赖它。
6. 把这次打包做成可回溯的工程:补丁版号与安装记录的导出技巧
补丁(Patch)管理这个功能,是 Advanced Installer 20.7.1 里最值得花一小时研究的模块。公司软件每两周发一个小版本,每次都让用户重新下载完整 MSI 体量太大,补丁包可以把增量做得很小。做法是在同一个 .aip 项目里维护多条构建版本,然后在“补丁”页面选择“新补丁”,指定基线版本(比如 1.0.0)和当前版本(1.1.0),工具会计算差异并生成 .msp 文件。命令行应用补丁的方式是:
# 向已安装的 MyApp 1.0.0 打补丁 msiexec /update "MyApp_1.0.0_to_1.1.0.msp" /qn /norestart补丁编号策略上我的习惯是:主版本号改升级码对应的产品版本,补丁版本只改补丁代码段内的 Build 号,这样补丁链不会乱套。如果发现补丁打不上,先看目标和补丁文件版本是不是同一条产品线,再看日志里有没有Patch failed to apply前面记录的错误码。
安装结束后,建议养成的最后一步是把安装日志和注册表快照一起归档。20.7.1 的“卸载信息”页面能导出一份包含所有注册表项、快捷方式、文件和服务的清单,这份清单既是验收凭据,也是将来做差异比较的基准。我过去因为没保留基线,每次排查升级问题都要重新反编译 MSI 看里面的表数据,后来固定为构建后自动导出,项目交接时能省一整天。打包工具看着体量不大,真正决定交付质量的,还是这些记录习惯和版本纪律。希望帮到你。
本文还有配套的精品资源,点击获取