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

为WPF应用引入依赖注入时遇调试器外异常问题求助

问题解决方法

1. 窗口出现两次的原因及解决

WPF默认会通过App.xaml里的StartupUri="MainWindow.xaml"自动创建并显示主窗口,你在OnStartup里又手动调用window.Show(),等于启动了两次窗口。解决很简单:

  • 打开App.xaml,删掉或者注释掉StartupUri="MainWindow.xaml"这一行。

2. 空引用异常的解决

这跟两个包的兼容性没关系,是WPF默认启动机制搞的鬼。当你保留StartupUri时,WPF会尝试调用MainWindow的无参构造函数,但你只写了带参的,这时候就会触发空引用异常(本质是构造函数找不到导致的错误,只是调试器没加载符号所以显示为空引用)。

完整修正步骤:

第一步:修改App.xaml

移除自动启动配置:

<Application x:Class="你的应用名.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
         
    </Application.Resources>
</Application>

第二步:调整App.xaml.cs的代码顺序(可选但推荐)

把编码注册的代码放在最前面,避免后续操作碰到编码问题:

protected override void OnStartup(StartupEventArgs e)
{
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

    var services = new ServiceCollection();
    services.AddSingleton<ViewModel.MainVM>();
    services.AddScoped<MainWindow>();

    var serviceProvider = services.BuildServiceProvider();
    var window = serviceProvider.GetRequiredService<MainWindow>();
    window.Show();
}

第三步:保留现有MainWindow构造函数

你的带参构造函数逻辑没问题,不用改:

public partial class MainWindow : Window
{
    private readonly ViewModel.MainVM mainVM;
    public MainWindow(ViewModel.MainVM mainVM)
    {
        this.mainVM = mainVM;
        this.DataContext = mainVM;
        InitializeComponent();
    }
}

补充说明

  • CommunityToolkit.Mvvm和Microsoft.DependencyInjection完全兼容,不存在兼容性问题,你的问题纯是WPF默认启动和手动DI启动的冲突导致的。
  • 调试符号加载失败的话,可以试试清理解决方案后重新生成,或者在调试设置里开启“启用.NET框架源代码步进”(如果需要调试框架代码)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:07:49