.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
相关产品推荐
相关产品推荐

