反射System.ValueTuple时System.Core 2.0.5.0加载失败及加载方式差异问题
关于System.ValueTuple反射时加载System.Core 2.0.5.0的异常问题
最近处理反射相关的场景时,碰到了一个针对System.ValueTuple程序集的奇怪异常:当遍历该程序集的类型并获取自定义属性时,会根据程序集加载方式的不同,抛出“无法加载文件或程序集System.Core 2.0.5.0”的错误。
触发异常的代码
只要执行这段遍历类型并获取属性的逻辑,就可能触发异常:
foreach (var type in valueTupleAssembly.GetTypes()) { var attributes = type.GetCustomAttributes(typeof(string), false); }
不同加载方式的表现
- 会触发异常的加载方式:使用
Assembly.LoadFile或直接通过字节数组加载的Assembly.Loadvar valueTupleAssembly = Assembly.LoadFile(path); // 或者通过字节数组加载 var valueTupleAssembly = Assembly.Load(File.ReadAllBytes(path)); - 运行正常的加载方式:使用
Assembly.LoadFromvar valueTupleAssembly = Assembly.LoadFrom(path);
待确认的疑问
我们知道System.ValueTuple是支持版本重定向的,它对System.Core的依赖理论上应该自动解析为当前执行环境的可用版本,但这里有两个关键点还需要明确:
- 为什么只有反射
TupleExtensions类型时才会触发System.Core 2.0.5.0的解析请求?同程序集里的其他类型都没有这个问题。 - 为什么
LoadFrom不会出现异常?目前的猜测是.NET的程序集绑定加载器(Fusion)在LoadFrom的场景下,自动完成了System.Core 2.0.5.0到当前环境可用版本的重定向,但这个机制的具体原因还需要进一步验证。
内容的提问来源于stack exchange,提问作者Joseph Evensen
相关产品推荐
相关产品推荐

