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

跨.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 06:55:03