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

使用反射提取程序集类型列表时抛出ReflectionTypeLoadException如何解决

解决方案

方案1:适配现有逻辑的动态依赖加载方案

你可以通过运行时按需加载依赖的方式解决该问题,不需要提前引用所有Nuget包:

  • 在加载目标程序集前,注册当前应用域的AssemblyResolve事件,当反射过程中出现缺失的程序集请求时,自动触发该事件回调
  • 回调逻辑中,根据请求的程序集名称,优先从目标dll所在目录、本地Nuget缓存路径搜索匹配的dll文件,搜索到后调用Assembly.LoadFrom加载并返回即可
  • 如果仍有部分非必要依赖无法加载,可以捕获ReflectionTypeLoadException异常,从异常的Types属性中提取所有加载成功的类型,忽略加载失败的类型即可,不会影响你读取标记了ApiControllerAttribute的公开类型。

示例代码参考:

// 注册依赖加载事件,提前保存目标dll所在目录
var targetDir = Path.GetDirectoryName(asmPath);
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
    var asmName = new AssemblyName(args.Name).Name + ".dll";
    var searchPath = Path.Combine(targetDir, asmName);
    if (File.Exists(searchPath))
    {
        return Assembly.LoadFrom(searchPath);
    }
    // 这里可以补充搜索本地Nuget缓存路径的逻辑
    return null;
};

// 加载目标程序集后读取类型时增加异常处理
Type[] allTypes;
try
{
    allTypes = asm.GetTypes();
}
catch (ReflectionTypeLoadException ex)
{
    allTypes = ex.Types.Where(t => t != null).ToArray();
}

方案2:更优的静态元数据扫描方案(推荐)

如果你只需要读取程序集的元数据、不需要执行其中的代码,该方案是最优选择:

  • 采用微软官方的System.Reflection.Metadata库直接读取dll的PE文件结构,全程不需要将程序集加载到当前应用域,也不需要加载任何依赖程序集,完全不会出现依赖缺失的异常
  • 扫描性能更高,也不会出现不同版本程序集冲突的问题,特别适合批量处理大量不同的dll文件。

你只需要通过该库读取dll的元数据,遍历类型的自定义特性标记、方法的参数列表即可拿到你需要的所有信息。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:36:02