跨.NET版本访问Assembly.DefinedTypes抛出StackOverflowException求助
问题描述
执行以下代码时抛出StackOverflowException:
var t = typeof(SomeType).Assembly.DefinedTypes;
调试发现异常触发在RuntimeAssembly.cs的GetType(this)方法中,对应框架代码:
internal RuntimeType[] GetDefinedTypes() { return GetTypes(this); }
关键现象:
SomeType所在项目目标框架为.NET 6,执行代码的项目目标框架为.NET 7时触发异常;- 将执行项目改为.NET 6后,异常消失;
- 访问
Assembly.DefinedTypes是Program.cs的第一个调用,代码本身无循环逻辑; - 已尝试重启、重建项目,
global.json指定SDK版本为7.0.400。
可能的原因分析
.NET 7类型加载递归逻辑缺陷
.NET 7对程序集类型加载流程做了调整,跨框架版本加载(.NET 6程序集在.NET 7运行时加载)时,GetTypes方法处理某些特殊类型(如带循环依赖的嵌套类型、关联自定义类型加载器的类型)时,会触发意外的递归调用,最终导致栈溢出。跨框架程序集元数据兼容性问题
.NET 6与.NET 7在程序集元数据的存储、解析逻辑上存在细微差异,当.NET 7运行时枚举.NET 6程序集的DefinedTypes时,元数据处理环节出现逻辑冲突,引发无限递归。SDK与运行时版本不匹配
虽然global.json指定了7.0.400 SDK,但如果实际运行环境的.NET 7 runtime存在特定版本bug,也可能触发该问题。尝试升级到最新的.NET 7补丁版本或许能解决。特殊类型构造触发递归加载
若SomeType所在程序集包含特殊构造的类型——比如自定义属性的构造函数依赖当前程序集内的其他类型,或者嵌套类型存在间接循环引用——在.NET 7的类型加载逻辑下会触发递归加载,进而导致栈溢出。
内容的提问来源于stack exchange,提问作者Dan Friedman
相关产品推荐
相关产品推荐

