为何.NET Framework中Assembly.LoadFrom跨系统行为存在差异?
问题原因解答
1. 底层运行环境差异
首先明确前提:.NET Framework 4.7.2是Windows专属运行时,Mac系统上不存在原生.NET Framework实现,你在TeamCity Mac代理上运行程序时,实际使用的是Mono兼容运行时,二者对Assembly.LoadFrom的实现逻辑存在本质差异,这是导致表现不一致的核心原因。
2. Windows侧行为符合.NET Framework原生规则
你查阅的官方文档中「相同标识已加载则直接返回」的规则,前提是两次加载的程序集四元组标识(名称+版本+区域性+公钥令牌)完全一致。
你的场景里两次加载的MyLib版本分别是1.1.0.0和2.2.0.0,本身就不属于相同标识,所以.NET Framework允许将两个不同版本的程序集同时加载到默认上下文(HostContext=0)中,Windows侧的表现完全符合官方设计。
3. Mac侧Mono运行时的实现简化
Mono对LoadFrom方法做了轻量化实现,默认仅匹配程序集的简单名称,不会完整校验四元组标识:只要已加载过同名程序集,不管版本、路径是否有差异,都会直接返回已加载的实例,所以才会出现调用LoadFrom加载1.1.0版本路径,却返回已加载的2.2.0版本实例的情况。
这是Mono跨平台实现的设计取舍,不属于运行时bug。
兼容解决方案
如果需要在跨平台场景下强制加载指定路径的程序集,可将Assembly.LoadFrom替换为Assembly.LoadFile,该方法在.NET Framework和Mono下都会直接加载指定路径的程序集文件,不受已加载同名程序集的影响。
内容的提问来源于stack exchange,提问作者user1234567
相关产品推荐
相关产品推荐

