WiX Installer:如何多次运行带不同属性的MSI安装包?
实现WiX引导程序同时安装到多个MSFS根目录
嘿,作为刚接触WiX Bootstrapper的新手,能想到要支持多MSFS版本安装真的很实用——毕竟玩家们经常同时装着不同版本的模拟器!针对你的需求,我整理了几个可行的方案,从简单到进阶都有:
方案1:多次调用同一个MSI,每次指定不同目录(最适合新手)
WiX的Burn引导程序允许你在<Chain>里多次包含同一个MSI包,只要给每个实例分配唯一的Id,并传递不同的INSTALLDIR属性就行。这是最直接的方式,几乎不需要修改你的现有MSI。
举个配置示例:
<Chain> <!-- 安装到MSFS 2020目录 --> <MsiPackage Id="Addon_MSI_2020" SourceFile="YourMSFSAddon.msi" DisplayInternalUI="yes"> <MsiProperty Name="INSTALLDIR" Value="C:\Program Files\Microsoft Flight Simulator 2020\Community\" /> </MsiPackage> <!-- 安装到MSFS 2024目录 --> <MsiPackage Id="Addon_MSI_2024" SourceFile="YourMSFSAddon.msi" DisplayInternalUI="yes"> <MsiProperty Name="INSTALLDIR" Value="C:\Program Files\Microsoft Flight Simulator 2024\Community\" /> </MsiPackage> </Chain>
进阶优化:让用户选择要安装的版本
如果想让玩家自己勾选要安装的目标版本,你可以在Bootstrapper的UI里添加复选框组件,收集用户选择的目录后,通过Burn的变量系统动态控制哪些<MsiPackage>实例被激活。比如给每个MsiPackage加上Condition属性,只有当用户勾选了对应版本时才执行安装:
<Variable Name="InstallTo2020" Type="bool" Value="no" /> <Variable Name="InstallTo2024" Type="bool" Value="no" /> <Chain> <MsiPackage Id="Addon_MSI_2020" SourceFile="YourMSFSAddon.msi" Condition="InstallTo2020"> <MsiProperty Name="INSTALLDIR" Value="[MSFS2020Path]\Community\" /> </MsiPackage> <MsiPackage Id="Addon_MSI_2024" SourceFile="YourMSFSAddon.msi" Condition="InstallTo2024"> <MsiProperty Name="INSTALLDIR" Value="[MSFS2024Path]\Community\" /> </MsiPackage> </Chain>
方案2:修改MSI本身支持多目录安装(适合进阶需求)
如果你不想在Bootstrapper里重复添加MSI实例,可以让MSI自己处理多路径部署。核心思路是定义一个多值属性,然后用自定义动作遍历这个属性里的每个路径,完成文件复制。
步骤1:在MSI中定义多值属性
<!-- 定义存储多个目标目录的多值属性 --> <Property Id="TARGETDIRS" MultiValue="yes" /> <!-- 添加自定义动作DLL(需要自己用C#/C++编写) --> <Binary Id="CustomActions" SourceFile="YourCustomActions.dll" /> <CustomAction Id="CopyToMultipleDirs" BinaryKey="CustomActions" DllEntry="CopyFilesToDirectories" Execute="deferred" Impersonate="no" /> <!-- 在安装序列中执行自定义动作 --> <InstallExecuteSequence> <Custom Action="CopyToMultipleDirs" After="InstallFiles" /> </InstallExecuteSequence>
步骤2:在Bootstrapper中传递多目录值
把用户选择的多个目录用分号分隔,传递给MSI的TARGETDIRS属性:
<MsiPackage Id="Addon_MSI" SourceFile="YourMSFSAddon.msi"> <MsiProperty Name="TARGETDIRS" Value="[UserSelectedDir1];[UserSelectedDir2]" /> </MsiPackage>
这种方式的好处是只需要调用一次MSI,但缺点是需要编写自定义动作,对WiX新手来说门槛稍高。
方案3:自动检测已安装的MSFS版本,批量安装
如果想让引导程序自动识别玩家电脑上已安装的MSFS版本,无需用户手动选择,可以用Burn的DirectorySearch功能查找各个版本的安装路径,然后自动添加对应的安装任务:
<!-- 搜索MSFS 2020安装目录 --> <Variable Name="MSFS2020Dir" Type="string" /> <DirectorySearch Id="FindMSFS2020" Path="C:\Program Files\Microsoft Flight Simulator 2020" AssignToProperty="yes" /> <!-- 搜索MSFS 2024安装目录 --> <Variable Name="MSFS2024Dir" Type="string" /> <DirectorySearch Id="FindMSFS2024" Path="C:\Program Files\Microsoft Flight Simulator 2024" AssignToProperty="yes" /> <Chain> <!-- 只有找到2020目录才安装 --> <MsiPackage Id="Addon_MSI_2020" SourceFile="YourMSFSAddon.msi" Condition="MSFS2020Dir"> <MsiProperty Name="INSTALLDIR" Value="[MSFS2020Dir]\Community\" /> </MsiPackage> <!-- 只有找到2024目录才安装 --> <MsiPackage Id="Addon_MSI_2024" SourceFile="YourMSFSAddon.msi" Condition="MSFS2024Dir"> <MsiProperty Name="INSTALLDIR" Value="[MSFS2024Dir]\Community\" /> </MsiPackage> </Chain>
这个方案特别适合批量部署,玩家不需要手动选择,引导程序会自动完成所有已安装版本的附加包安装。
总结
- 新手优先选方案1:操作简单,不需要修改现有MSI,快速实现多目录安装。
- 若需要更灵活的用户交互,结合方案1的条件判断和UI组件。
- 进阶需求可以考虑方案2,让MSI本身处理多路径,但需要编写自定义动作。
- 自动批量安装选方案3,用Burn的搜索功能简化用户操作。
内容的提问来源于stack exchange,提问作者lequinne
相关产品推荐
相关产品推荐

