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

UWP调用CoreApplication.RequestRestartAsync抛出System.Private.CoreLib异常

关于UWP CoreApplication.RequestRestartAsync 抛出0x80040900异常的排查方案

首先,咱们拆解下你的问题:你在Windows 10 16299(确实是该API的最低支持版本)上调用CoreApplication.RequestRestartAsync(string.Empty)时,应用能关闭但抛出0x80040900的HRESULT异常,调试时捕获困难,另一台机器却正常运行。下面是具体的原因分析和解决办法:

可能的原因

  • 调试器附加的冲突:这是最常见的情况。在Visual Studio调试模式下,应用进程始终被调试器挂载,当调用重启API时,系统尝试启动新的应用进程,但旧进程的调试器还未完全释放,导致新进程启动时触发冲突,抛出这个异常。这种情况通常只出现在调试环境,发布后的应用不会有这个问题。
  • 本地应用注册损坏:既然另一台机器正常,说明代码逻辑没问题,大概率是你当前机器上的UWP应用注册信息出了问题——重启API需要系统读取应用的注册信息来启动新进程,一旦注册损坏,就会找不到正确的启动入口,抛出错误。
  • 空参数的潜在兼容问题:虽然官方文档说明可以传入string.Empty作为重启参数,但在某些特定的系统补丁或环境下,空参数可能导致重启逻辑无法正确解析启动上下文,进而触发异常。

调试与解决步骤

  1. 先脱离调试环境验证
    停止Visual Studio的调试会话,直接从开始菜单或应用安装目录打开已安装的应用,调用重启功能。如果此时应用能正常重启不报错,那就是调试器附加导致的问题,属于调试场景的正常现象,不用担心发布版本的表现。

  2. 捕获更详细的异常信息
    你可以在调用处增强异常处理,解析HRESULT对应的详细错误描述,代码示例如下:

    using System.Runtime.InteropServices;
    // ...
    try
    {
        await CoreApplication.RequestRestartAsync(string.Empty);
    }
    catch (Exception ex)
    {
        var hrException = Marshal.GetExceptionForHR(ex.HResult);
        Debug.WriteLine($"重启失败:{ex.Message}");
        Debug.WriteLine($"HRESULT代码:0x{ex.HResult:X8}");
        if (hrException != null)
        {
            Debug.WriteLine($"详细描述:{hrException.Message}");
        }
    }
    

    这样能帮你更精准定位错误的具体原因。

  3. 修复应用注册信息
    打开PowerShell(以管理员身份),运行以下命令重新注册你的应用(替换你的应用包名为实际包名,可以从Visual Studio项目属性的“打包”选项卡中找到):

    Get-AppxPackage *你的应用包名* | Foreach-Object {Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocation)\AppxManifest.xml"}
    

    这个命令会重置应用的注册信息,修复可能存在的损坏。

  4. 尝试非空重启参数
    暂时把string.Empty换成一个合法的自定义参数(比如"-restart"),调用CoreApplication.RequestRestartAsync("-restart"),看是否还会抛出异常。如果正常,说明空参数在当前环境下存在兼容问题,你可以保留非空参数的写法,后续在应用启动时解析这个参数即可。

关于调试时无法捕获异常的问题

那个来自System.Private.CoreLib.dll的异常,其实是在重启后的新应用进程中抛出的,而旧的调试器实例还附着在已关闭的旧进程上,所以无法捕获新进程的异常。你可以这样处理:

  • 在调用RequestRestartAsync之前,手动断开调试器(Visual Studio菜单:调试->断开所有),然后在新进程启动时,通过调试->附加到进程手动选择新的应用进程进行调试。
  • 或者在项目属性的“调试”选项卡中,设置启动参数后,勾选“启用本地机器调试”,让Visual Studio自动跟踪重启后的新进程。

内容的提问来源于stack exchange,提问作者user7066852

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:57:49