MAUI中引发的异常:“System.Runtime.InteropServices.COMException

引发的异常:“System.InvalidOperationException”

“TodoReminderApp.exe”(CoreCLR: clrhost): 已加载“C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.2\System.ComponentModel.TypeConverter.dll”。
引发的异常:“System.InvalidOperationException”(位于 WinRT.Runtime.dll 中) “TodoReminderApp.exe”(CoreCLR: clrhost): 已加载“F:\Merchant\project\todotask\TodoReminderApp\TodoReminderApp\bin\Debug\net8.0-windows10.0.19041.0\win10-x64\System.Drawing.Common.dll”。
引发的异常:“System.Runtime.InteropServices.COMException”(位于 Microsoft.Toolkit.Uwp.Notifications.dll 中)

根据你提供的日志信息,你的 .NET 8.0 WinUI/UWP 应用(TodoReminderApp.exe)在启动时遇到了严重的组件加载和初始化异常。

从报错来看,核心问题出在 Windows Runtime (WinRT) 环境未正确配置,以及可能存在的 系统依赖缺失。以下是针对这些异常的深度分析和逐步修复方案:

1. 核心异常分析

  • System.InvalidOperationException (位于 WinRT.Runtime.dll): 自 .NET 5.0 起,.NET 移除了对 WinRT API 的内置支持。如果你的项目没有正确指定 Windows SDK 版本,或者缺少 C#/WinRT 投影包,运行时就会抛出此异常。
  • System.Runtime.InteropServices.COMException (位于 Microsoft.Toolkit.Uwp.Notifications.dll)Microsoft.Toolkit.Uwp.Notifications 是一个强依赖 Windows 通知服务(Toast Notifications)的库。这个 COM 异常通常意味着底层 WinRT 组件激活失败,或者你的程序没有有效的 AppUserModelID (AUMID),导致无法向系统注册通知客户端。
  • System.Drawing.Common.dll 加载警告: 虽然它成功加载了,但在现代 .NET Core/.NET 5+ 项目中引入 System.Drawing.Common 可能会引发跨平台兼容性问题或隐式依赖冲突。如果非必须,建议排查是否有其他库在暗中引用它。

清理缓存并重新编译

有时旧的编译缓存会导致 DLL 版本冲突:

  1. 在 Visual Studio 中执行 “清理解决方案” (Clean Solution)
  2. 手动删除项目下的 binobj 文件夹。
  3. 右键点击项目 -> “还原 NuGet 包”
  4. 重新生成并运行。

额外排查建议

如果上述操作后仍然报 COMException,你可以按 Win + R 输入 eventvwr.msc 打开事件查看器,导航至: 应用程序和服务日志 -> Microsoft -> Windows -> Notifications -> Operational 在这里可以查看详细的 Toast 通知提交失败原因(例如错误码 0x800704900x80070005),这能帮你精准定位是权限问题还是 AUMID 未设置的问题。

错误应用程序名称: TodoReminderApp.exe,版本: 4.0.0.0,时间戳: 0x65a80000
错误模块名称: KERNELBASE.dll,版本: 10.0.19041.3996,时间戳: 0xb756c9ff
异常代码: 0xc000027b
错误偏移量: 0x000000000012d952
错误进程 ID: 0x4b80
错误应用程序启动时间: 0x01dcf7a8c31fd146
错误应用程序路径: F:\Merchant\project\todotask\TodoReminderApp\TodoReminderApp\bin\Debug\net8.0-windows10.0.19041.0\win10-x64\TodoReminderApp.exe
错误模块路径: C:\Windows\System32\KERNELBASE.dll
报告 ID: 72927fe1-e132-4954-8e32-bac0076424a3
错误程序包全名: 
错误程序包相对应用程序 ID: 

一、关键报错解析

1. 核心错误码

P7: 80040154 = REGDB_E_CLASSNOTREG

直译:COM 类未注册,这是 Windows COM/WinRT 组件经典报错,和你之前 Microsoft.Toolkit.Uwp.Notifications、WinRT 调用报错完全对上。

2. 故障特征

  • 事件:APPCRASH 程序直接崩溃(不是单纯异常,进程终止)
  • 故障栈:StackHash12_3e6,典型 COM 组件调用时内存 / 句柄异常
  • 场景:.NET8 Windows 程序调用 UWP/WinRT 通知组件,目标 COM 运行时组件缺失 / 未注册 / 架构不匹配

结合上一轮日志,根因汇总:

  1. 项目未启用 WinRT 运行时支持
  2. 混用 UWP 原生通知 API(未用桌面兼容版)
  3. 平台架构、目标 Windows 版本、依赖包不匹配
  4. 系统侧 Windows Runtime / UWP 组件损坏 / 缺失

二、分步修复(按优先级执行,从上到下)

步骤 1:强制修正项目配置(.csproj 必改)

强制平台架构,彻底禁用 AnyCPU

打开项目文件,补充 / 修改以下节点,缺一不可

<!-- 目标框架保持你当前版本 -->
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
<!-- 关键1:启用 Windows 运行时支持 -->
<EnableWindowsRuntime>true</EnableWindowsRuntime>
<!-- 关键2:如果是 MAUI/WPF/WinForms 桌面端,按需开启 -->
<UseWindowsForms>true</UseWindowsForms>
<UseWPF>false</UseWPF>

<!-- 关键3:强制平台架构,彻底禁用 AnyCPU -->
<PlatformTarget>x64</PlatformTarget>
<Prefer32Bit>false</Prefer32Bit>

保存后 关闭 VS,删除 bin、obj 文件夹,重新打开项目编译。

发布 / 调试部署补充

  1. 调试:始终选择 x64 平台,不要用 AnyCPU /x86
  2. 发布配置(避免运行时缺失)
    • 部署模式:独立部署
    • 目标运行时:win10-x64
    • 勾选:包括所有运行时依赖