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

ContextMenuStrip子项赋值Text时触发StackOverflowException问题排查

问题描述

场景说明

  • 有一个ContextMenuStrip,其中包含一个作为其他菜单项子项的ToolStripMenuItem,此前添加Click事件后运行正常。

异常情况

  • 调试时,点击按钮打开包含该ContextMenuStrip的窗体失败,应用内存占用从正常30MB飙升至180MB,触发无提示信息的StackOverflowException,异常发生在子项Text赋值代码行。

已尝试方案

  • 新建相同配置的ContextMenuStrip替换原控件,问题依旧;
  • 搜索相关案例未找到匹配场景。

异常触发代码

//FormName.Designer.cs

//
// openInExplorerTSMI
//
this.openInExplorerTSMI.CheckOnClick = false;
this.openInExplorerTSMI.Name = "openInExplorerTSMI";
this.openInExplorerTSMI.Size = new System.Drawing.Size(198, 22);
this.openInExplorerTSMI.Text = "Open in explorer"; //StackOverflowException here.
this.openInExplorerTSMI.Click += new System.EventHandler(this.openInExplorerTSMI_Click);
排查与解决思路
  1. 检查Text属性的自定义重写
    如果openInExplorerTSMI是自定义的ToolStripMenuItem子类,检查是否重写了Text属性,且重写逻辑中直接或间接再次赋值Text导致无限递归。比如错误写法:

    public override string Text
    {
        get => base.Text;
        set
        {
            this.Text = value; // 此处递归调用自身,引发栈溢出
            // 正确写法应为 base.Text = value;
        }
    }
    
  2. 排查初始化流程的递归调用
    查看窗体构造函数、Load事件,或openInExplorerTSMI相关初始化代码,确认是否存在设置Text时触发控件重复初始化、窗体重新创建的逻辑,形成循环调用。

  3. 验证Click事件处理逻辑
    临时注释掉Click事件绑定代码,测试是否仍触发异常。若注释后恢复正常,说明openInExplorerTSMI_Click方法中存在触发控件初始化流程的逻辑,导致间接递归。

  4. 检查本地化或资源文件问题
    若使用了本地化资源,确认资源键名是否与控件名称冲突,或资源读取逻辑存在循环引用,导致设置Text时触发意外递归。

  5. 清理设计器冗余代码
    手动清理FormName.Designer.cs中重复的控件初始化代码,避免重复属性赋值或事件绑定。也可以尝试手动编写openInExplorerTSMI的初始化代码,替代设计器生成代码,验证是否解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:48:22