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

.NET7线程调用GetTypes()时R2R程序集引发访问冲突

解决R2R程序集调用GetTypes()触发访问冲突的问题

方案1:捕获异常跳过有问题的程序集

遍历程序集时,给GetTypes()调用加上异常捕获,专门处理访问冲突和类型加载相关的异常,直接跳过出问题的程序集:

foreach (var assembly in AssemblyLoadContext.Default.Assemblies)
{
    try
    {
        var types = assembly.GetTypes();
        // 这里处理获取到的类型
    }
    catch (AccessViolationException)
    {
        // 跳过引发访问冲突的程序集(比如R2R格式的PresentationFramework)
        continue;
    }
    catch (ReflectionTypeLoadException ex)
    {
        // 部分类型加载失败时,可筛选出已成功加载的类型处理
        var validTypes = ex.Types.Where(t => t != null);
        // 处理validTypes
    }
    catch
    {
        // 捕获其他可能的异常,比如权限问题等,直接跳过
        continue;
    }
}

方案2:提前识别并跳过R2R程序集

R2R程序集会带有ReadyToRunAttribute特性,你可以提前检测这个特性,直接跳过这类程序集:

using System.Runtime.CompilerServices;

foreach (var assembly in AssemblyLoadContext.Default.Assemblies)
{
    bool isR2R = assembly.GetCustomAttributes(typeof(ReadyToRunAttribute), inherit: false).Any();
    if (isR2R)
    {
        continue;
    }

    try
    {
        var types = assembly.GetTypes();
        // 处理类型
    }
    catch
    {
        continue;
    }
}

方案3:尝试获取公共导出类型替代全量类型

如果需要从R2R程序集获取部分类型,可以用GetExportedTypes()替代GetTypes(),这个方法只返回公共导出类型,可能避开内部类型加载时的冲突:

foreach (var assembly in AssemblyLoadContext.Default.Assemblies)
{
    try
    {
        var publicTypes = assembly.GetExportedTypes();
        // 处理公共导出类型
    }
    catch (AccessViolationException)
    {
        continue;
    }
}

额外提示:确保应用运行的架构(x86/x64)和R2R程序集的目标架构一致,架构不匹配也可能触发访问冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 23:47:54