安装NuGet包后调用IQueryable.Where()出现System.Runtime.Loader加载错误
问题描述
在.NET Framework项目中安装某NuGet包后,编译、重建及调试启动均正常,但仅当实际调用该NuGet包的代码(如构造函数/方法)后,执行IQueryable.Where()时会抛出以下错误:
Could not load file or assembly 'System.Runtime.Loader, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
- 未实际使用该NuGet包时,
Where()调用完全正常;仅添加using不调用也无问题。 - 项目及NuGet包本身均未直接引用
System.Runtime.Loader,也找不到间接引用该程序集的路径。 - 已知
System.Runtime.Loader不支持.NET Framework,且项目与NuGet包单独运行均正常。
解决方案
1. 添加程序集绑定重定向
.NET Framework中,版本冲突可能触发错误的程序集加载请求。在项目的App.config或Web.config中添加以下配置,强制重定向或阻止加载System.Runtime.Loader:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Runtime.Loader" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <!-- 重定向到兼容版本,若找不到则启用publisherPolicy跳过加载 --> <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.1.0" /> <!-- <publisherPolicy apply="no" /> --> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
2. 排查NuGet包的传递依赖
部分NuGet包可能通过传递依赖引入.NET Core专属组件,即使标注支持.NET Framework:
- 在Visual Studio中右键项目→管理NuGet程序包→查看该包的“依赖项”列表,排查是否有.NET Core专属包。
- 用命令行工具
dotnet list package --include-transitive(或NuGet控制台的Get-Package -All -ProjectName 你的项目名)查看所有传递依赖,定位是否有引用System.Runtime.Loader的包。 - 若发现问题依赖,尝试更新该NuGet包到最新.NET Framework兼容版,或联系包作者修复。
3. 启用程序集加载日志定位根源
通过Visual Studio的加载日志找到触发请求的组件:
- 打开Visual Studio→调试→选项→调试→输出窗口→勾选“程序集加载消息”的“启用”。
- 重启调试触发错误,查看输出窗口的日志,找到请求加载
System.Runtime.Loader的调用栈,定位根源。
4. 清理缓存并重建
缓存文件可能导致异常引用:
- 删除项目的
bin和obj文件夹。 - 右键解决方案→清理解决方案→重建解决方案。
- 清除NuGet缓存:工具→NuGet包管理器→包管理器设置→清除所有NuGet缓存。
内容的提问来源于stack exchange,提问作者ysi_d
相关产品推荐
相关产品推荐

