You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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: '&quot;C:\ProgramData\Package Cache\A6046A33-3B0E-4830-9C1B-7646FF871D66\InstallerApp.exe&quot; 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: '&quot;C:\ProgramData\Package Cache\706251C0-EC22-446C-A89A-DA7A7980A26F\InstallerApp.exe&quot; 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 23:44:56