ASP.NET Core 2.1集成与单元测试运行失败:无法加载程序集
解决ASP.NET Core 2.1测试项目的程序集加载异常与版本冲突问题
当你把测试项目升级到ASP.NET Core 2.1,或者新建一个用于测试ASP.NET Core 2.1应用的测试项目时,大概率会碰到这两类问题:
- 运行测试时直接抛出
System.IO.FileNotFoundException,提示找不到Microsoft.AspNetCore, Version=2.1.0.0这个程序集 - 构建过程中弹出一堆
MSB3277警告,都是关于不同版本的Microsoft.Extensions.Options、Microsoft.Extensions.Configuration.Abstractions等组件冲突的
下面是我整理的针对性解决步骤,一步步来就能搞定:
一、修复程序集加载异常
这个问题本质是测试项目没有正确关联ASP.NET Core 2.1的共享框架或者依赖引用缺失,按以下步骤排查:
- 添加ASP.NET Core元包引用:
不管你用的是xUnit、NUnit还是MSTest,都需要在测试项目的.csproj文件里加上Microsoft.AspNetCore.App的引用——2.1版本的这个元包不需要指定版本号,因为.NET Core 2.x是通过共享框架来管理版本的:<ItemGroup> <PackageReference Include="Microsoft.AspNetCore.App" /> </ItemGroup> - 确认目标框架设置正确:
检查测试项目的TargetFramework必须是netcoreapp2.1,不能是net461这类.NET Framework框架,毕竟ASP.NET Core 2.1的共享框架只支持.NET Core运行时:<PropertyGroup> <TargetFramework>netcoreapp2.1</TargetFramework> </PropertyGroup> - 清理重建解决方案:
执行下面的命令清除缓存并重新构建,避免旧的程序集残留干扰:dotnet clean dotnet restore dotnet build
二、消除MSB3277版本冲突警告
这些警告是因为不同依赖库引用了同一组件的不同版本导致的,ASP.NET Core 2.1的共享框架已经统一了这些基础组件的版本,我们只需要强制对齐版本即可:
- 显式指定冲突组件的版本:
在测试项目的.csproj文件中,给所有冲突的组件添加PackageReference,显式指定版本为2.1.0(和共享框架版本保持一致):<ItemGroup> <PackageReference Include="Microsoft.Extensions.Options" Version="2.1.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="2.1.0" /> <PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="2.1.0" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="2.1.0" /> <PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.1.0" /> <PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="2.1.0" /> </ItemGroup> - 用Directory.Build.props统一管理版本(多项目场景推荐):
如果你的解决方案里有多个项目,可以在根目录创建Directory.Build.props文件,统一设置所有项目的依赖版本,不用每个项目单独改:<Project> <PropertyGroup> <MicrosoftExtensionsPackageVersion>2.1.0</MicrosoftExtensionsPackageVersion> <AspNetCorePackageVersion>2.1.0</AspNetCorePackageVersion> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Extensions.Options" Version="$(MicrosoftExtensionsPackageVersion)" /> <!-- 其他冲突组件依葫芦画瓢添加即可 --> </ItemGroup> </Project> - 更新测试框架依赖:
确保你用的测试框架版本和ASP.NET Core 2.1兼容,比如xUnit建议用2.4.0及以上版本,xUnit.runner.visualstudio用2.4.1及以上版本,旧版本的测试框架可能会依赖更老的组件版本,引发冲突。
完成以上操作后,再运行测试应该就能正常执行,构建时的版本冲突警告也会消失啦。
内容的提问来源于stack exchange,提问作者Martin Ullrich
相关产品推荐
相关产品推荐

