如何让WiX Bootstrapper调用MSI的维护UI而非自身维护UI
解决WiX Bootstrapper无法调用MSI Mondo维护UI的问题
默认WiX标准Bootstrapper Application(BA)的维护界面仅提供修复、卸载选项,不会自动触发MSI的功能修改UI。以下是两种可行的解决方案:
方案1:通过命令行参数触发MSI修改UI
在Bundle配置中添加命令行参数支持,让用户可以手动触发MSI的维护修改流程:
- 在Bundle的
.wxs文件中定义用于识别修改模式的变量:
<Variable Name="LaunchModify" Type="string" Value="" Persisted="no" />
- 修改
MSIPackage节点的配置,添加条件以触发MSI的修改操作:
<MSIPackage SourceFile="YourProduct.msi" Cache="always" EnableFeatureSelection="yes" DisplayInternalUI="yes" Vital="yes" InstallCondition="NOT Installed OR LaunchModify = 'true'" ModifyCondition="LaunchModify = 'true'" > </MSIPackage>
- 用户运行Bootstrapper时,通过命令行参数启动修改界面:
YourBootstrapper.exe LaunchModify=true
方案2:自定义Bootstrapper Application(推荐)
默认标准BA不支持维护界面的"修改"选项,需自定义BA添加该功能:
- 创建C#语言的WiX Bootstrapper Application项目(使用Visual Studio的WiX模板)。
- 在自定义BA的维护UI中添加"修改"按钮,与修复、卸载按钮并列。
- 处理按钮点击事件,通过WiX Bootstrapper API触发MSI修改流程:
private void ModifyButton_Click(object sender, EventArgs e) { string targetPackageId = "YourMSIPackageId"; // 替换为你MSIPackage的Id Result planResult = _bootstrapper.PlanModify(targetPackageId); if (planResult == Result.Success) { _bootstrapper.ApplyChanges(); } }
- 在Bundle的
.wxs中引用自定义BA:
<BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost"> <Payload SourceFile="path\to\YourCustomBA.dll" /> <Payload SourceFile="path\to\YourCustomBA.exe.config" /> </BootstrapperApplicationRef>
额外注意事项
- 确保MSI中已正确配置
<UIRef Id="WixUI_Mondo" />,且单独运行MSI可正常显示修改界面。 - 保持Bootstrapper与MSI的安装范围一致(如均为
PerMachine),避免权限或检测冲突。 - 保留
MSIPackage的Cache="always"属性,确保Bootstrapper能找到缓存的MSI文件启动维护UI。
内容的提问来源于stack exchange,提问作者Joe Moisan
相关产品推荐
相关产品推荐

