使用Assembly.LoadFile仍触发AssemblyResolve致栈溢出,微软文档有误?
问题分析与解决方案
为什么会触发StackOverflowException?
- 你设置的绑定重定向把所有版本范围(0.0.0.0-7.0.0.0)的Microsoft.Extensions.Logging.Abstractions都强制指向7.0.0.0,但你的测试文件夹里只有5.0.0.0版本的文件。当CLR尝试加载不存在的7.0.0.0版本时,就会触发AssemblyResolve事件。
- 如果你在事件处理程序里加载本地的5.0.0.0版本,CLR会立刻应用绑定重定向规则,再次要求加载7.0.0.0版本,形成无限循环——事件触发→加载低版本→CLR执行重定向→再次触发事件,最终导致栈溢出。
微软文档没出错,是你忽略了绑定重定向的优先级
微软文档提到LoadFile/LoadFrom不会触发AssemblyResolve,是指直接调用这些方法加载程序集的动作本身不会触发事件,但如果加载后CLR因为绑定重定向规则要求加载特定版本,或者加载的程序集有其他未解析的依赖,事件还是会触发。你的情况属于前者:
- 用
LoadFile加载5.0.0.0版本后,CLR会严格执行绑定重定向,认为应该使用7.0.0.0版本,于是再次发起解析请求,循环就此产生。
可行的解决办法
- 调整绑定重定向规则:不要把所有版本都重定向到7.0.0.0,只针对实际需要覆盖的旧版本设置,比如仅将低于5.0.0.0的版本重定向到5.0.0.0,让CLR直接加载本地存在的版本。
- 在事件处理中阻断循环:在AssemblyResolve事件里,检查当前请求的程序集版本,如果是绑定重定向后的7.0.0.0,直接返回已加载的5.0.0.0版本,同时记录已处理的程序集,避免重复触发。
- 移除不必要的重定向:如果你的场景只是检查本地文件夹的依赖完整性,完全可以删掉这条绑定重定向规则,让CLR自动加载本地存在的程序集版本。
内容的提问来源于stack exchange,提问作者Very Professional Username
相关产品推荐
相关产品推荐

