添加NUnit测试项目遇FileNotFoundException:无法加载CommonLibrary程序集
核心原因:跨框架程序集加载不兼容
你的测试项目基于.NET 8(属于.NET Core/.NET 5+生态),而目标测试项目MyProject_VM和依赖的CommonLibrary.dll都是基于.NET Framework 4.8编译的。这两个框架的程序集解析逻辑完全不同:.NET 8运行时无法按照.NET Framework的加载规则找到并加载专属的程序集,哪怕你直接引用了该库,也会因为框架环境不匹配导致加载失败。
修改<Private>属性无效的原因
<Private>属性仅控制程序集是否被复制到输出目录,但你的问题本质是框架兼容性不匹配,而非程序集是否存在于输出目录。就算程序集被复制过去,.NET 8运行时也无法正确识别并加载.NET Framework专属的程序集。
可行解决办法
将测试项目改为.NET Framework 4.8
直接把NUnit测试项目的目标框架切换为.NET Framework 4.8,让测试环境和目标项目的运行环境完全一致,程序集加载逻辑就能匹配。操作步骤:右键测试项目→属性→应用程序→目标框架,选择.NET Framework 4.8,重新引用MyProject_VM和CommonLibrary即可,无需修改<Private>属性。迁移CommonLibrary到.NET Standard 2.0
如果必须保留测试项目为.NET 8,可将CommonLibrary的目标框架改为.NET Standard 2.0(该版本同时兼容.NET Framework 4.8和.NET 8)。这样两个项目都能正常加载该程序集,从根源解决框架不兼容问题。注意:迁移前要检查CommonLibrary是否使用了.NET Framework专属API(如System.Web、WPF旧特性等),如有需替换为兼容的替代方案。手动指定程序集加载路径(临时方案)
若暂时无法修改框架或迁移库,可在测试的OneTimeSetUp阶段手动添加程序集搜索路径:[OneTimeSetUp] public void Setup() { // 替换为CommonLibrary.dll所在的实际路径,例如MyProject_VM的输出目录 var libraryPath = Path.Combine(Directory.GetParent(Environment.CurrentDirectory).Parent.Parent.FullName, "MyProject_VM", "bin", "Debug", "net48"); AppDomain.CurrentDomain.AppendPrivatePath(libraryPath); }该方法较为脆弱,项目结构或输出路径变化后会失效,仅适合临时测试使用。
内容的提问来源于stack exchange,提问作者Jean-David Lanz

