WiX 3.14中需重启的ExePackage依赖注册失败问题排查
问题
使用WiX 3.14制作带自定义托管Bootstrapper应用程序(BA)的Bundle安装程序,其中ExePackage配置如下:
<ExePackage Id="InstallDependency" DisplayName ="Installing Dependency" SourceFile="$(var.InstallerApp.TargetPath)" CacheId="B63A80A5-FE60-4945-AAD8-186BA680B810" PerMachine="yes" DetectCondition="CurrentVersionBundleInstalled" InstallCommand="install [WixBundleLog_InstallDependency]" UninstallCommand="uninstall [WixBundleLog_InstallDependency]"> <PayloadGroupRef Id="InstallerAppDependencies"/> <ExitCode Behavior="success" Value="0"/> <ExitCode Behavior="error" Value="-1"/> <ExitCode Behavior="forceReboot" Value="2"/> <dep:Provides Key="Dependency" Version="1.2.3.4"/> </ExePackage>
该包安装完成后返回退出码2请求立即重启,但依赖注册操作未在重启前执行,后续也未写入注册表。安装日志片段如下:
[0444:2358][2024-09-23T13:44:51]i323: Registering package dependency provider: Foo, version: 1.0.0.0, package: FooPackage [0444:2358][2024-09-23T13:44:51]i301: Applying execute package: FooPackage, action: Install, path: C:\ProgramData\Package Cache\A6046A33-3B0E-4830-9C1B-7646FF871D66\InstallerApp.exe, arguments: '"C:\ProgramData\Package Cache\A6046A33-3B0E-4830-9C1B-7646FF871D66\InstallerApp.exe" install cleanup eyJWZXJzaW9uIjoiMy4xMC4wLjAiLCJVcGdyYWRpbmdGcm9tVmVyc2lvbiI6IjMuOS4zLjAiLCJCb290c3RyYXBGb2xkZXIiOiJcXFxcdHNjbGllbnRcXENcXGRldlxcaW5zaWdodGNtXFxBXFxJbnN0YWxsZXJcXEJvb3RzdHJhcHBlclxcYmluXFxEZWJ1Z1xcIiwiQnVuZGxlTG9nRmlsZSI6IkM6XFxVc2Vyc1xcQURNSU5JfjFcXEFwcERhdGFcXExvY2FsXFxUZW1wXFxJbnNpZ2h0Q01fMjAyNDA5MjMxMzM4MjYubG9nIiwiRGF0YUZvbGRlciI6IkM6XFxQcm9ncmFtRGF0YVxcQ3V0c2ZvcnRoXFxJbnNpZ2h0Q01cXEZpbGVzIiwiRGF0YWJhc2VGb2xkZXIiOiJDOlxcUHJvZ3JhbURhdGFcXEN1dHNmb3J0aFxcSW5zaWdodENNXFxNb25nb0RCIn0= C:\Users\ADMINI~1\AppData\Local\Temp\InsightCM_20240923133826_001_FooPackage.log' [0364:2F68][2024-09-23T13:44:51]i319: Applied execute package: FooPackage, result: 0x0, restart: None [0444:2358][2024-09-23T13:44:51]i325: Registering dependency: {9f02661f-3564-4fd2-90e6-7ec111fec691} on package provider: Foo, package: FooPackage // Dependency on package "Foo" successfully registered because FooPackage didn't request reboot [0444:2358][2024-09-23T13:48:37]i323: Registering package dependency provider: Bar, version: 3.10.1.0, package: BarPackage [0444:2358][2024-09-23T13:48:37]i301: Applying execute package: BarPackage, action: Install, path: C:\ProgramData\Package Cache\706251C0-EC22-446C-A89A-DA7A7980A26F\InstallerApp.exe, arguments: '"C:\ProgramData\Package Cache\706251C0-EC22-446C-A89A-DA7A7980A26F\InstallerApp.exe" install nipm-dependencies eyJWZXJzaW9uIjoiMy4xMC4wLjAiLCJVcGdyYWRpbmdGcm9tVmVyc2lvbiI6IjMuOS4zLjAiLCJCb290c3RyYXBGb2xkZXIiOiJcXFxcdHNjbGllbnRcXENcXGRldlxcaW5zaWdodGNtXFxBXFxJbnN0YWxsZXJcXEJvb3RzdHJhcHBlclxcYmluXFxEZWJ1Z1xcIiwiQnVuZGxlTG9nRmlsZSI6IkM6XFxVc2Vyc1xcQURNSU5JfjFcXEFwcERhdGFcXExvY2FsXFxUZW1wXFxJbnNpZ2h0Q01fMjAyNDA5MjMxMzM4MjYubG9nIiwiRGF0YUZvbGRlciI6IkM6XFxQcm9ncmFtRGF0YVxcQ3V0c2ZvcnRoXFxJbnNpZ2h0Q01cXEZpbGVzIiwiRGF0YWJhc2VGb2xkZXIiOiJDOlxcUHJvZ3JhbURhdGFcXEN1dHNmb3J0aFxcSW5zaWdodENNXFxNb25nb0RCIn0= C:\Users\ADMINI~1\AppData\Local\Temp\InsightCM_20240923133826_005_BarPackage.log' [0364:2F68][2024-09-23T13:50:26]i319: Applied execute package: BarPackage, result: 0x0, restart: Initiated // Here's where I would expect the dependency on dependency provider "Bar" to be registered [0444:2358][2024-09-23T13:50:26]i372: Session end, registration key: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9f02661f-3564-4fd2-90e6-7ec111fec691}, resume: Reboot Pending, restart: Initiated, disable resume: No [0444:2358][2024-09-23T13:50:26]i371: Updating session, registration key: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9f02661f-3564-4fd2-90e6-7ec111fec691}, resume: Reboot Pending, restart initiated: Yes, disable resume: No [0364:2F68][2024-09-23T13:50:26]i399: Apply complete, result: 0x0, restart: Initiated, ba requested restart: No
BA中处理ExecutePackageComplete事件及重启请求的代码如下:
private void Bootstrapper_ExecutePackageComplete(object sender, ExecutePackageCompleteEventArgs e) { try { if (_bootstrapper.Status.IsCanceled) { _bootstrapper.Log("Initiating cancelation."); e.Result = Result.Cancel; return; } else if (e.Status < 0) { // Handle errors } else if (e.Restart == ApplyRestart.RestartInitiated) { e.Result = Result.Restart; _bootstrapper.Status.RestartRequired = true; } } catch (Exception ex) { // Log exception e.Result = Result.Error; } }
疑问:是BA处理重启请求的方式有误,还是WiX 3存在导致依赖注册无法执行的Bug?暂无升级WiX版本的计划。
分析与解决方案
这是WiX 3.x版本中Burn引擎的已知行为,并非你BA代码的问题。当ExePackage返回forceReboot对应的退出码时,Burn会直接触发重启流程,跳过了后续的依赖注册步骤(即日志中i325对应的操作),且重启后不会补做该注册。
针对WiX 3.14,可采用以下几种方案解决:
- 调整重启触发时机:修改Exe安装程序的逻辑,将需要重启的操作延迟到依赖注册完成后执行,或者让Exe先返回成功码,由BA在所有包安装完成后统一触发重启。
- 手动完成依赖注册:在BA的
ExecutePackageComplete事件中,当检测到目标包安装成功且需要重启时,手动模拟Burn的依赖注册逻辑,将依赖信息写入对应注册表路径(PerMachine包对应HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\[BundleID]\Dependencies)。 - 修改ExePackage配置:暂时将
ExitCode的forceReboot行为改为success,在BA中标记需要重启,待Burn完成所有包的依赖注册后,再调用重启接口触发系统重启。
内容的提问来源于stack exchange,提问作者Brian Henry
相关产品推荐
相关产品推荐

