Windows Installer能否同时安装两个MSI文件?WIX MSI自动安装IIS Express咨询
关于Windows Installer多MSI安装及WIX自定义操作的问题
1. Windows Installer是否支持同时安装两个MSI文件?
简单来说:不行。Windows Installer核心有一个安装互斥机制,同一时间只能有一个MSI的安装、修改或卸载会话在运行。如果你尝试同时启动两个MSI安装程序,第二个会被系统阻塞,直到第一个安装完成;运气不好的话还会直接弹出错误提示,告知已有Windows Installer进程在运行。
2. WIX制作的MSI完成后自动安装IIS Express 10.0的问题
先看你给出的自定义操作代码片段,这里有几个关键问题需要调整:
首先,自定义操作的执行时机和权限不对
你把InstallIISExpress设置为Execute="immediate",这会导致两个问题:
- Immediate模式的自定义操作是在安装脚本生成前运行的,此时你的主MSI还没完成安装,而且这种模式下的操作会模拟当前用户权限,安装IIS Express这类需要系统权限的组件可能会失败。
- 更关键的是:在当前MSI的安装会话中直接启动另一个MSI(IIS Express的安装包)会触发Windows Installer的互斥锁,直接导致安装失败。
推荐的两种解决方案
方案一:使用WIX Burn制作引导程序(最稳妥)
这是处理多安装包依赖的标准做法,用Burn创建一个.exe引导程序,按顺序先安装你的主MSI,再安装IIS Express的MSI。Burn会自动处理安装互斥问题,还能提供统一的进度界面、错误处理和回滚支持。
大致步骤:
- 在WIX项目中添加一个Bootstrapper项目
- 配置你的主MSI和IIS Express的MSI作为Burn的链式包
- 设置安装顺序,确保主MSI安装完成后再启动IIS Express的安装
方案二:通过独立进程触发后续安装(适合不想用Burn的场景)
如果一定要在主MSI安装完成后触发IIS Express的安装,可以这么做:
- 把
InstallIISExpress自定义操作改成Execute="commit"或者After="InstallFinalize"的immediate操作,并且让它启动一个脱离当前MSI进程的独立程序(比如一个小型的exe或者批处理脚本) - 这个独立程序要延迟几秒(避免Windows Installer互斥锁还没释放),然后调用
msiexec /i "IISExpress10.msi" /quiet这类静默安装命令 - 注意:自定义操作不能等待这个独立程序的安装完成,必须立即返回,否则还是会触发互斥问题
另外,你的CheckIISExpressStatus自定义操作是对的,用immediate模式检查系统中是否已安装IIS Express,然后设置一个属性(比如NEED_INSTALL_IIS),再在安装序列里通过条件判断是否执行后续的安装操作,比如:
<InstallExecuteSequence> <Custom Action="InstallIISExpress" After="InstallFinalize">NOT IIS_EXPRESS_INSTALLED</Custom> </InstallExecuteSequence>
最后提醒:尽量用Burn方案,因为它能完美处理多安装包的依赖、回滚和错误情况,比自定义操作可靠得多。
内容的提问来源于stack exchange,提问作者Garry.Gu
相关产品推荐
相关产品推荐

