无法在.NET类库xUnit测试中加载Npgsql组件问题咨询
嘿,我之前在写Entity Framework的xUnit测试时也碰到过几乎一模一样的问题,折腾了好一阵才解决,给你几个实用的排查和解决方向:
确保测试项目与主项目的NuGet包版本完全一致
这是最常见的原因:主项目里的Npgsql.EntityFrameworkCore.PostgreSQL是2.0.2.0,但测试项目可能引用了不同版本,或者依赖的基础包版本不匹配。- 右键测试项目 → 管理NuGet包,找到
Npgsql.EntityFrameworkCore.PostgreSQL,确认版本是2.0.2.0,和主项目完全一致; - 同时检查依赖的
Npgsql包版本,2.0.2的EF Core PostgreSQL provider对应的基础Npgsql包应该是4.0.x系列,别选错版本。
- 右键测试项目 → 管理NuGet包,找到
清理缓存并重建解决方案
有时候旧的编译缓存会导致程序集加载冲突,按以下步骤操作:- 在Visual Studio中点击菜单 → 生成 → 清理解决方案;
- 手动删除测试项目下的
bin和obj文件夹; - 重新生成整个解决方案,确保所有程序集都是最新编译的。
添加程序集绑定重定向(仅适用于.NET Framework项目)
如果你的测试项目是基于.NET Framework的,可能需要在app.config中添加绑定重定向,强制加载指定版本的程序集:<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Npgsql.EntityFrameworkCore.PostgreSQL" publicKeyToken="5d8b90d52f46fda7" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.0.2.0" newVersion="2.0.2.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>注意:.NET Core/.NET 5+项目不需要绑定重定向,这类框架采用了不同的程序集加载机制。
确认测试项目的目标框架与主项目匹配
跨框架引用很容易出现程序集加载问题:比如主项目是.NET Core 2.0,测试项目却用了.NET Framework 4.7。右键测试项目 → 属性 → 应用程序,检查目标框架是否和主项目完全一致。排查依赖项冲突
错误提示里提到“or one of its dependencies”,可能是其他依赖包版本不兼容:- 检查测试项目中
Microsoft.EntityFrameworkCore的版本,2.0.2的PostgreSQL provider对应的EF Core版本必须是2.0.x,不能用3.0+的版本; - 用NuGet包管理器的“查看依赖项”功能,检查是否有其他与Npgsql相关的包存在版本冲突。
- 检查测试项目中
临时应急方案(不推荐长期使用)
如果上面的方法都没解决,可以尝试把主项目bin文件夹中的Npgsql.EntityFrameworkCore.PostgreSQL.dll和Npgsql.dll复制到测试项目的bin文件夹中,确保版本一致。不过这只是临时解决,最好还是从NuGet层面彻底解决版本问题。
内容的提问来源于stack exchange,提问作者scornflake

