VS测试资源管理器请求的Microsoft.Extensions.DependencyInjection.Abstractions版本低于已安装版本
我有一个基于.NET Framework 4.8.1的测试项目,已安装3.1.9版本的Microsoft.Extensions.DependencyInjection.Abstractions NuGet包(该版本是同项目安装的CSLA.NET NuGet包的最低要求版本)。但在测试资源管理器中运行测试时,程序却尝试加载**旧版本(v3.1.0)**的该包;后续将包版本升级到3.1.32后,测试运行时又会去查找3.1.9版本。
已尝试以下操作但未解决问题:
- 将包版本升级至v3.1.32
- 移除测试项目中对该包的直接引用(该包在被测试项目中已使用)
- 执行清理+重建操作
- 删除测试项目的bin和obj文件夹
- 升级Visual Studio 2022至最新版本17.5.3
查看测试项目的bin\Debug目录,能确认正确版本的包文件已存在。
可能的解决方案
1. 显式添加程序集版本重定向
在测试项目的App.config中添加程序集绑定配置,强制CLR加载指定版本的组件:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.Extensions.DependencyInjection.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-3.1.32" newVersion="3.1.32" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
注意:将
newVersion替换为你实际安装的包版本(比如3.1.9或3.1.32)。
2. 排查依赖链中的间接引用
查看被测试项目和测试项目的完整NuGet依赖树,确认是否有第三方包间接引用了更低版本的Microsoft.Extensions.DependencyInjection.Abstractions:
- 通过Visual Studio的NuGet包管理器-已安装-查看依赖项逐一检查
- 运行命令列出所有传递依赖:
dotnet list package --include-transitive
找到冲突来源后,可针对性升级相关第三方包,或补充对应的版本重定向配置。
3. 绕过测试资源管理器缓存验证
尝试用命令行直接运行测试,排查是否是Visual Studio测试资源管理器的缓存问题:
vstest.console.exe "你的测试项目路径\bin\Debug\TestProject.dll"
如果命令行运行正常,可尝试重置Visual Studio的组件缓存:关闭VS后删除%LOCALAPPDATA%\Microsoft\VisualStudio\17.0_XXX\ComponentModelCache目录(XXX为VS实例标识),再重新打开项目。
4. 检查CSLA.NET的版本约束
确认当前使用的CSLA.NET包是否对Microsoft.Extensions.DependencyInjection.Abstractions有严格的版本限制,尝试升级CSLA.NET到最新兼容版本,看是否能自动解决版本匹配问题。
内容的提问来源于stack exchange,提问作者Oskar Fjeld

