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);
排查与解决思路
检查
Text属性的自定义重写
如果openInExplorerTSMI是自定义的ToolStripMenuItem子类,检查是否重写了Text属性,且重写逻辑中直接或间接再次赋值Text导致无限递归。比如错误写法:public override string Text { get => base.Text; set { this.Text = value; // 此处递归调用自身,引发栈溢出 // 正确写法应为 base.Text = value; } }排查初始化流程的递归调用
查看窗体构造函数、Load事件,或openInExplorerTSMI相关初始化代码,确认是否存在设置Text时触发控件重复初始化、窗体重新创建的逻辑,形成循环调用。验证Click事件处理逻辑
临时注释掉Click事件绑定代码,测试是否仍触发异常。若注释后恢复正常,说明openInExplorerTSMI_Click方法中存在触发控件初始化流程的逻辑,导致间接递归。检查本地化或资源文件问题
若使用了本地化资源,确认资源键名是否与控件名称冲突,或资源读取逻辑存在循环引用,导致设置Text时触发意外递归。清理设计器冗余代码
手动清理FormName.Designer.cs中重复的控件初始化代码,避免重复属性赋值或事件绑定。也可以尝试手动编写openInExplorerTSMI的初始化代码,替代设计器生成代码,验证是否解决问题。
内容的提问来源于stack exchange,提问作者Error404
相关产品推荐
相关产品推荐

