单元测试调用项目A方法时资源文件访问失败,报MissingManifestResourceException求助
这种单元测试里资源加载抛MissingManifestResourceException的情况我碰到过好几次,核心原因大多是单元测试环境的程序集加载逻辑、资源引用方式和主应用不一样,咱们一步步来排查解决:
确保单元测试项目直接引用了项目B
虽然你的主项目A已经引用了B,但单元测试运行时的程序集加载上下文是独立的,可能无法间接加载B的资源。右键单元测试项目 → 添加引用 → 选中项目B,确保它被直接引用。修正ResourceManager的程序集获取逻辑
你当前用的Assembly.GetAssembly()在单元测试环境下可能拿到的是单元测试项目的程序集,而不是包含资源的A或B项目的程序集。建议改成用具体类来定位程序集:// 假设FormTexts实际属于项目B,用B里的任意类来获取程序集 ResourceManager rm = new ResourceManager("MyProjects.B.Resources.FormTexts", typeof(SomeClassInProjectB).Assembly); // 如果是A项目链接了资源且命名空间是MyProjects.A.Resources.FormTexts,就用A里的类 // ResourceManager rm = new ResourceManager("MyProjects.A.Resources.FormTexts", typeof(YourClassInProjectA).Assembly); var str = rm.GetString("Title");这种方式能精准定位到包含资源的程序集,避免加载歧义。
检查资源文件的生成属性
分别查看项目B的原FormTexts.resx和项目A里的链接资源:- 右键资源文件 → 属性
- 确认生成操作设置为
嵌入的资源,而不是内容或其他选项
链接过来的资源偶尔会丢失属性设置,手动确认一遍更稳妥。
清理缓存并重新生成解决方案
单元测试很容易被旧的编译缓存坑到,先手动删除所有项目的bin和obj文件夹,然后右键解决方案 → 重新生成,再运行单元测试。检查单元测试的工作目录
部分测试框架(比如MSTest)默认工作目录不是主项目的输出目录,导致资源无法被找到。可以在单元测试里先输出当前目录排查:Console.WriteLine(System.IO.Directory.GetCurrentDirectory());如果目录不对,在单元测试项目的属性 → 调试 → 工作目录中设置为项目A的输出路径(比如
$(SolutionDir)A\bin\$(Configuration)\)。
按照上面的步骤排查,尤其是修正程序集获取逻辑那一步,大概率能解决你的问题。我之前就是因为单元测试环境下Assembly.GetAssembly()加载了错误的程序集,才出现和你一样的报错。
内容的提问来源于stack exchange,提问作者syedripon

