
简介Advanced Installer 20.7.1是一款功能强大的Windows安装包制作工具主要面向软件开发者、打包工程师及需要分发桌面应用的团队用于快速生成符合MS Windows认证的MSI安装文件解决手工配置安装程序繁琐耗时的问题。压缩包共包含2000个文件整体大小约161.36MB文件类型以png、jpg等界面图片素材、aip工程文件、ico图标、xsd配置定义、xsl样式表、ps1脚本为主基本覆盖了从产品界面设计、安装流程配置到部署脚本编写的完整打包链路。已有944人浏览学习适合需要系统掌握MSI打包工具或定制专属安装界面的技术人员。包内提供了大量aip示例工程及配套资源可直接打开查看工程结构、借鉴界面布局也可在此基础上修改配置生成自己的安装包其中丰富的png、jpg、ico素材可快速用于定制欢迎界面与安装过程界面配合xsd、xsl等配置样式能明显降低Advanced Installer的上手门槛与打包排错成本尤其适合需要快速交付专业安装程序的开发者。1. Advanced Installer 20.7.1软件打包工具把Windows软件交付从玄学变成可复现的工程做Windows桌面软件的人大概率经历过这种场景开发完一个内部工具把exe、dll、配置文件一股脑塞进压缩包发给对方然后收到消息“打不开”“装完没有开始菜单”“卸载不干净”。Advanced Installer 20.7.1这类软件打包工具解决的从来不是“把文件塞进安装包”这一件事而是把软件交付变成一条可复现、可自动化的工程链路选对MSI还是EXE、配置好升级关系、写对注册表、让静默参数和日志可排查。适合谁被交付问题反复折磨的桌面软件开发者和运维以及想把打包接入持续集成的小伙伴。新手一晚上能出第一个安装包熟手在这里面能抠出不少细节。2. 先弄清安装包的类型与工程结构MSI、EXE和.aip工程文件很多人在Advanced Installer里卡住不是不会点按钮而是没搞明白自己到底要生成什么。安装包类型选错后面的所有配置方向都会歪返工成本极高。这一章先把地基讲清楚再讲工程里该关心哪些条目最后给一份可以直接对着整理的资源清单。2.1 MSI与EXE的差别选错类型后面全在返工Advanced Installer 20.7.1可以基于同一个工程产出MSI或EXE但两者不是“换个壳”的关系安装引擎和适用场景都不一样。我一般先问三个问题谁来装、怎么装、要不要被管理。对比项MSIEXE安装引擎Windows Installer 标准自解压引导 内部安装逻辑静默参数msiexec /i xxx.msi /qn看引导程序定义无统一标准权限管理支持按机器/按用户安装、提升权限由引导程序自行处理企业分发支持组策略、SCCM等管理通道一般走手动或脚本下发回滚机制自带事务回滚装一半失败可回滚取决于引导程序实现升级关联基于Upgrade Code和Product Code自动处理需要自己维护升级逻辑我的选择习惯是企业内部分发、需要被管理系统纳管的工具优先MSI对公下载、用户需要一键双击完成的软件EXE更友好。Advanced Installer里创建工程时它会引导你选类型这个选择后期改起来很费劲——涉及整个安装流程的配置所以开工前想清楚。2.2 Advanced Installer工程里最关键的四类条目一个.aip工程文件里配置项很多但真正决定安装包行为的是下面这四类。配置好后其余多数默认值就够用。Product Details产品名称、版本号、Product Code、Upgrade Code、支持语言。这是安装包的身份信息Windows的“添加/删除程序”里显示什么、系统按什么规则识别新旧版本全看这里。Files and Folders目标机器上的目录树。左边栏对应源文件右边栏决定文件装到哪个目录用方括号引用系统文件夹比如安装目录通常映射到[ProgramFilesFolder]下的子目录。Registry、Environment、Shortcuts需要写入注册表项、修改环境变量、生成开始菜单和桌面快捷方式时在这里配。注意这几类条目的“per-machine”和“per-user”作用域作用域错了会导致提权行为和卸载清理都出问题。Prerequisites与Launch Conditions检查前置依赖和安装条件比如检测某个运行时是否存在、系统版本是否满足、是否已安装某个旧版本。对新手来说最容易忽略的是Product Code和Upgrade Code的区别。Product Code是当前这个版本的身份证每次发版都应该换Upgrade Code是整个产品系列的身份证永远不变。把这两个搞反升级安装一定会报“另一个版本已安装”。2.3 打包前先盘一遍资源目录规划与运行时文件清单动手建工程之前先花半小时把要发布的文件分类。我通常按四类放程序文件主exe、依赖的dll、组件资源这些放安装目录。只读配置程序启动时读取但不修改的配置可以放安装目录。可写配置运行时要改写的配置、日志目录、用户数据放到ProgramData或AppData对应目录。运行库VC运行库、.NET运行时等用Prerequisites功能做启动条件检查而不是自己复制到安装目录。这一步我吃过亏。某个内部工具把配置文件放在安装目录普通用户装完后启动没问题一保存配置就报“拒绝访问”——程序文件默认装在Program Files下标准用户没有写权限。后来把可写数据改到AppData问题才消失。所以建工程前先问自己这个文件安装后会不会被程序修改会就放数据目录别放安装目录。这个思路确定下来后面在Advanced Installer里建目录结构就是填空不会反复改。3. 从零打包一个最小MSIGUI配置与命令行构建这一章带你把第一个能安装、能卸载的最小MSI做出来。目标是先跑通链路知道每一步在做什么再去研究升级、静默、清理这些复杂场景。3.1 新建工程与导入文件最简单的一条路径打开Advanced Installer 20.7.1新建工程时选择“MSI”类型。工程向导会让你设置产品基本信息先随便填一个名称和版本后面还要细调。进入主界面后左侧导航栏从上到下依次是Product Details、Files and Folders、Registry、Shortcuts等页面这就是整个安装包的配置主线。导入文件在Files and Folders页面操作右侧是目标机器上的目录结构默认会预置一个安装目录。在左侧文件系统里选到你的源程序文件夹把需要发布的文件拖到右侧安装目录下。拖进去之后注意每个文件右下角的小图标它表示文件组件Component的归属同一个组件的文件会被Windows Installer一起安装、一起卸载。一般把一个功能模块的文件放同一个组件比如主程序组件、帮助文档组件不要把所有文件塞一个组件后面做功能级卸载控制会方便很多。3.2 设置产品信息、版本号与升级码回到Product Details页面这里有三个字段需要重点理解产品名称显示在控制面板里的名字建议直接写“软件名版本”比如“内部工具 1.2.0”用户在控制面板里一眼能认出来。Product Code当前版本的唯一标识每次发布新版本必须生成新的不能沿用旧值。Upgrade Code产品系列标识所有后续版本保持一致。这里是发布前必须检查的字段一旦某个版本用了错误的Upgrade Code后面所有升级都会找不到旧版本。版本号格式建议用“主.次.修订.构建”四段比如1.2.0.0。如果你希望版本号自动跟随主程序exe的文件版本可以在工程选项里设置“产品版本来自文件版本”这样每次替换exe安装包版本会自动对齐少一个忘记改版本号的隐患。3.3 用命令行构建安装包可复现的第一步图形界面点“Build”按钮能出包但我要强调一条习惯从一开始就用命令行构建。原因很简单——命令可以写进脚本、进持续集成、避免“换台电脑就以相似但不同的方式出包”。Advanced Installer自带命令行入口AdvancedInstaller.com安装后在安装目录的bin\x86下面。C:\Program Files (x86)\Advanced Installer\bin\x86\AdvancedInstaller.com /build D:\work\your-app.aip这条命令的逻辑路径是AdvancedInstaller.com所在位置/build是构建动作后面跟.aip工程文件绝对路径。构建输出位置在工程里配置命令行不重复指定保持单一配置源。第一次跑的时候建议先关掉当前的GUI工程避免两个实例同时访问.aip文件产生文件锁冲突。跑完后去工程设置的输出目录看到.msi文件说明命令行链路通了。后续每次改配置都用这条命令重新出包不要在GUI里反复点Build——两者产物一致但命令行可追溯、可脚本化这是从“手工打包”跨到“工程化打包”的关键一步。3.4 安装包建完先做三个检查拿到第一个MSI后先别急着发给别人。花五分钟做三个检查# 手动安装一次生成详细安装日志 msiexec /i D:\out\your-app.msi /l*v D:\logs\first-install.log安装后去控制面板确认产品名称、版本号和安装路径正确。卸载一次确认安装目录被清空、开始菜单快捷方式被移除没有残留。再安装一次确认重复安装不会报错。这时如果弹“已安装另一个版本”就是3.2节说的Product Code或Upgrade Code配置有问题。/l*v参数是Windows Installer的标准详细日志开关后面跟日志文件完整路径。安装任何环节出问题打开这个日志文件搜索错误代码或“Return value 3”基本能定位到具体操作步骤。养成装包必带日志的习惯能省掉大量靠猜的排查时间。4. 静默安装、卸载清理与升级交付时躲不掉的三个场景第一个MSI跑通之后接下来就是真实交付中躲不掉的三个场景无人值守安装、安装时写入系统配置、升级而不覆盖用户数据。每一块都有各自的规则配置不对就是线上事故。4.1 静默安装参数怎么传MSI命令行与日志定位法MSI的静默安装由msiexec控制常用参数组合是这样msiexec /i D:\out\your-app.msi /qn /norestart /l*v D:\logs\silent-install.log/qn完全静默不显示任何安装界面。需要用户看到进度时用/qb只显示基础进度条。/norestart安装后不重启系统。如果安装包里有文件占用检测或需要重启的组件建议单独处理不要在这里直接允许重启否则用户会投诉“装个软件把我电脑重启了”。/l*v输出详细日志排错必备。静默安装翻车最典型的表现命令执行完没有任何提示但程序没装上或装得不完整。Windows Installer静默模式下遇到错误不会弹窗只会写日志并返回非零退出码。所以脚本里执行msiexec后立刻检查退出码然后打开日志搜“Return value 3”或错误码。我一般会在日志里同时搜三个关键词error、failed、return value 3基本能覆盖绝大多数安装失败原因。4.2 安装时写入注册表、环境变量与快捷方式Registry页面可以添加注册表写入项。关键决策是作用域HKLM机器级所有用户生效需要管理员权限适合写入全局关联、安装路径等。HKCU用户级只对当前安装用户生效适合用户偏好设置不需要管理员权限。如果你的安装包是per-machine安装给机器上所有用户装注册表写在HKCU会有问题安装时用的是管理员账户写入的是管理员的HKCU普通用户登录后根本读不到。经验做法是per-machine安装对应HKLMper-user安装对应HKCU不要交叉。环境变量在Environment页面配同样有系统级和用户级之分。改系统级环境变量要慎重最好加一个安装条件比如“仅当变量不存在时才写入”避免覆盖用户已有的配置。快捷方式在Shortcuts页面或直接在文件上右键创建目标路径建议用方括号引用属性比如[INSTALLDIR]表示安装目录[ProgramMenuFolder]表示开始菜单目录这样安装目录改名后快捷方式不会指向错误位置。4.3 升级包与旧版本卸载的联动升级场景是Advanced Installer里最需要提前规划的部分。规则归结起来三点新版本的Product Code必须换成新的Upgrade Code与旧版本保持一致在工程的Upgrades页面添加一条升级关系告诉安装引擎“我这个新版本要替换哪个Upgrade Code的旧版本”。这个页面配置后新MSI安装时会自动检测同系列旧版本先卸载旧版再装新版。如果不配置Upgrades关系会出现两个版本并存、注册表残留、文件被旧版覆盖等多重问题——这是MSI升级最常见的坑没有之一。有一个细节值得注意升级时旧版本的注册表项、用户数据默认不会被删。卸载旧版本时Windows Installer会清理它自己写入的注册表项但用户后来产生的数据、程序运行生成的配置都不在清理范围内。这本身是合理设计升级不应破坏用户数据但如果你的软件升级后数据结构大改旧的数据文件反而会干扰新版本运行那就需要额外写升级动作来处理。4.4 卸载时清理用户数据这个坑要提前想清楚默认情况下卸载MSI不会删除用户在AppData或ProgramData下生成的数据。这对大多数软件是对的——用户卸载后重装配置还在体验好。但如果你交付的是有缓存、有本地数据库、有敏感临时文件的工具不清理就可能留下隐私数据。要清理就得在Custom Actions里加卸载时执行的脚本或程序删除指定目录。这里我给一个提醒清理范围务必收敛只删你确实知道是本软件创建的数据目录不要图省事删用户整个AppData子目录。我接过一个翻车案例卸载脚本用通配符删数据目录结果把用户放里面的手工备份一起删了事后怎么解释都有理说不清。数据删除的代码宁精勿滥最好卸载前弹出提示询问“是否同时删除用户数据”给用户选择权。5. 打包路上的踩坑清单与排查思路这一章列五个我亲眼见过、自己也栽过的坑。每一条都按“现象→原因→解决”写希望能帮你少走几趟弯路。5.1 安装后程序启动即崩溃相对路径和工作目录的问题现象程序在开发机上双击能跑做成安装包装到别人机器上启动就崩或找不到配置文件。原因代码里用了相对路径比如读取“config.ini”程序启动时的当前工作目录不是安装目录——Windows默认工作目录可能是system32或调用方目录相对路径自然找不到文件。解决代码里改成用可执行文件所在路径拼接不要依赖当前工作目录。在安装侧能把路径写正确把配置文件的默认值通过配置文件写入功能放到正确位置而不是指望程序自己去找。排查这类问题最快的方法是打开进程与文件访问监控工具让它记录程序启动时读了哪些路径读失败路径一目了然比盲猜快得多。5.2 升级安装报“另一个版本已安装”ProductCode与UpgradeCode混淆现象新版本安装包双击后提示“该产品的另一个版本已安装”无法覆盖安装或者在控制面板里同时出现两个版本。原因Product Code没有随版本变更系统把新MSI当成旧版本的重装拒绝执行或者Upgrade Code填错升级关系匹配不上。解决每次发版前在Product Details页面生成新的Product Code确认Upgrade Code在所有版本里保持一致检查Upgrades页面是否配置了升级关系。这三步都做到位再跑一遍升级流程验证。这条翻车血的教训是最多的发版前一定要把这两个字段当作发布检查项。5.3 静默安装显示成功快捷方式却不在日志中找答案现象脚本里msiexec静默安装返回成功目标机器上程序文件在但开始菜单没有快捷方式。原因per-machine安装的快捷方式写入路径依赖系统上下文或者快捷方式指向的目标文件被安装条件跳过也可能是安装时使用的用户上下文导致快捷方式写到了另一个账户的配置文件里。解决打开详细安装日志搜“Shortcut”和“return value 3”定位快捷方式创建步骤的失败原因。大多数情况下是快捷方式的目标路径引用了错误属性比如硬编码了安装目录到一个不存在的位置。检查Shortcuts页面里目标路径是否使用了[INSTALLDIR]动态引用而不是写死的字符串。5.4 安装包被杀毒软件隔离签名、壳与特征的最小化定位现象安装包构建出来本机测试正常发给别人对方机器上被杀毒软件直接隔离。原因未经签名的安装包在新版Windows和主流杀毒软件里天然不受信任如果打包时套了加壳或压缩工具特征码命中概率更高。注意有些杀毒软件只是“误报”但误报也是报用户不会分这个。解决先给安装包做数字签名这是最实际的做法然后做最小化定位——构建一个不含任何业务文件、只含空目录的最小MSI测它是否被报毒。如果最小MSI不报、加入文件后报就用二分法逐步加文件定位是哪个文件触发特征。曾经有个项目定位到最后是某个运行时dll被报换一个构建方式就解决了。这套方法比反复提交误报申诉高效得多。5.5 中文乱码工程语言、文件编码和安装界面三者要一致现象安装界面按钮显示英文或乱码安装完成后配置文件中文全是问号。原因工程没有添加中文语言支持安装界面跟随系统语言走文本文件编码不一致比如程序按UTF-8读取配置文件却被保存成了GBK或者反过来。解决在Product Details的Languages里添加zh-CN语言安装界面文本逐条检查中文显示配置文件编码与程序读取方式保持一致这个一定要看程序代码不要想当然。如果程序明确按UTF-8读文件就存UTF-8按GBK读就保持GBK。统一编码反而会引发乱码——某次为了“规范化”把GBK配置改存UTF-8结果老版本不认。文件编码以程序实现为准不是以“标准”为准。6. 把打包接入自动构建一条命令出带签名的正式安装包前面所有配置跑顺之后最后一步是把打包从“手动操作”升级成“一条命令完成”。这里分享我的做法把.aip工程文件纳入版本控制和源码一起管理——它本质上是XML能diff能回溯谁改过哪里一清二楚这是整个打包工程化的基础。然后让持续集成脚本每天构建一次测试包只有打上版本标签时才构建正式包并签名。构建用3.3节的命令行签名和验证用下面两条命令。signtool sign /f D:\certs\code-sign.pfx /p 证书密码 /tr http://timestamp.example.com /td sha256 /fd sha256 D:\out\your-app.msi签名命令含义/f指定证书文件/p是证书密码/tr是时间戳服务器地址/td和/fd都指定为sha256保证签名和摘要算法一致。时间戳的作用是证书过期后已签名的安装包依然能通过验证。注意签名要在构建完成后做签完不要再对文件做任何二次修改否则签名失效。Get-AuthenticodeSignature -FilePath D:\out\your-app.msi | Select-Object Status, StatusMessage, SignerCertificate这条PowerShell命令验证签名状态Status为Valid才说明签名有效。在持续集成脚本里加一步验证签名失败直接中断构建不让未签名包流出。这比人工检查可靠得多。最后说一个我自己的习惯本机只出测试包正式包永远在持续集成环境生成并签名。这个习惯帮过我一次——某次本地机器环境变量被改过打出来的包行为和正式环境不一致差点把测试包发给外部。从那以后本地构建结果一律视为不可交付产物只有CI上的构建才允许分发。如果你还没把打包接进自动构建从把.aip文件提交进版本库开始这一步跑通后你会发现发版从“提心吊胆”变成“例行公事”。希望帮到你。本文还有配套的精品资源点击获取