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

WPF C#实现托盘图标时应用启动后立即闪退问题求助

问题原因排查
  • NotifyIcon 生命周期问题:你当前将Forms.NotifyIcon对象声明为OnStartup方法的局部变量,方法执行完成后该对象没有任何根引用,会被垃圾回收器自动回收。回收过程中触发NotifyIcon的非托管资源释放逻辑,会直接导致进程异常退出。
  • 图标文件路径错误:代码中使用相对路径"icon.ico"加载图标,程序运行时的工作目录不一定等于程序集所在目录,若对应路径下不存在图标文件,new System.Drawing.Icon("icon.ico")会直接抛出FileNotFoundException,未捕获异常的情况下程序会直接崩溃闪退。

你注释掉设置Icon的代码行后不会闪退的原因:一方面不会触发图标文件不存在的异常,另一方面未设置Icon的NotifyIcon被GC回收时的资源释放逻辑不会触发进程级别的致命错误,因此程序可以正常运行。

修复方案
  1. 将Forms.NotifyIcon升级为App类的全局成员变量,避免被GC提前回收
  2. 加载图标时使用程序集所在目录的绝对路径,避免相对路径带来的文件找不到问题,也可直接将图标嵌入程序集资源加载,稳定性更高

修复后代码示例

// App.xaml.cs 中先声明为全局成员
private System.Windows.Forms.NotifyIcon _notifyIcon;

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    MainWindow = new MainWindow();
    MainWindow.Show();

    _notifyIcon = new System.Windows.Forms.NotifyIcon();
    // 从程序集根目录加载图标,避免相对路径问题
    string iconFullPath = Path.Combine(AppContext.BaseDirectory, "icon.ico");
    _notifyIcon.Icon = new System.Drawing.Icon(iconFullPath);
    _notifyIcon.Visible = true;

    // 窗口关闭时主动释放托盘图标资源,避免进程残留
    MainWindow.Closed += (sender, args) =>
    {
        _notifyIcon.Dispose();
    };
}

注意:使用WinForms的NotifyIcon需要提前在项目中添加System.Windows.Forms和System.Drawing的程序集引用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:54:02