基于WixToolset实现MSI/EXE安装及API配置下载的项目结构咨询
WixToolset多安装包部署与自定义配置实现方案
一、能不能不用Bundle直接调用MSI?
不行,这是Windows Installer的固有限制——单个MSI只能部署自身内容,没办法链式启动其他MSI或EXE安装程序。WiX的Bundle(基于Burn引擎)就是专门用来解决多安装包部署问题的,是官方推荐的标准方案,别想着绕开它。
二、Bundle中怎么用CustomAction处理配置下载?
1. 写自定义动作实现配置下载
用C#或C++写CustomAction,在Bundle的检测/规划阶段调用API拉取对应机器的专属配置。注意要给动作加上系统权限(Impersonate="no"),避免网络访问或文件写入权限不足。
举个C# CustomAction的简单示例:
[CustomAction] public static ActionResult DownloadMachineConfig(Session session) { // 替换为实际的API调用逻辑,获取当前机器的配置 string tempPath = session["TempFolder"]; string configPath = Path.Combine(tempPath, "machine-specific-config.json"); // 模拟API下载(实际替换为HttpClient调用) File.WriteAllText(configPath, "{\"setting\":\"machine-specific-value\"}"); // 把配置路径存到Bundle属性中,供后续安装包引用 session["MACHINE_CONFIG_PATH"] = configPath; return ActionResult.Success; }
2. 在Bundle中配置并调用CustomAction
把编译好的CustomAction DLL加到Bundle项目里,然后在XML中注册并指定执行时机(建议在安装包之前运行):
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> <Bundle Name="MyAppInstaller" Version="1.0.0.0" Manufacturer="MyCompany" UpgradeCode="PUT-GUID-HERE"> <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" /> <!-- 注册自定义动作DLL --> <Binary Id="CustomActions.dll" SourceFile="..\CustomActions\bin\Release\CustomActions.dll" /> <CustomAction Id="DownloadConfig" BinaryKey="CustomActions.dll" DllEntry="DownloadMachineConfig" Execute="immediate" Impersonate="no" /> <Chain> <!-- 先执行配置下载动作 --> <CustomActionRef Id="DownloadConfig" /> <!-- 安装第一个供应商MSI --> <MsiPackage SourceFile="Vendor1.msi" /> <!-- 安装第二个供应商MSI,如需传递配置参数可添加MsiProperty --> <MsiPackage SourceFile="Vendor2.msi"> <MsiProperty Name="CONFIG_FILE" Value="[MACHINE_CONFIG_PATH]" /> </MsiPackage> <!-- 安装EXE,将配置路径作为命令行参数传入 --> <ExePackage SourceFile="VendorSetup.exe" InstallCommand="/config [MACHINE_CONFIG_PATH]" /> </Chain> </Bundle> </Wix>
3. 把配置传递给各个安装包
- 对MSI:如果供应商的MSI支持通过属性接收配置文件路径,就用
<MsiProperty>把Bundle里存储的MACHINE_CONFIG_PATH传进去 - 对EXE:直接在
InstallCommand里引用Bundle属性,比如上面的/config [MACHINE_CONFIG_PATH],确保EXE能识别该参数
三、项目搭建步骤
- 在Visual Studio中新建WiX Bootstrapper项目(即Bundle项目)
- 新建C#类库项目,安装
Microsoft.Deployment.WindowsInstallerNuGet包,编写配置下载的CustomAction逻辑
- 新建C#类库项目,安装
- 在Bundle项目中添加对CustomAction DLL的引用,编写Bundle XML配置动作和安装包链式执行顺序
- 编译生成Bootstrapper EXE,这个文件就是最终的安装程序,会自动处理多包的安装、依赖和回滚逻辑
内容的提问来源于stack exchange,提问作者blacky99
相关产品推荐
相关产品推荐

