单元测试项目调用被测试项目时程序集加载失败问题排查
程序集加载失败问题排查
问题背景
我有一个项目(ProjectA),使用了Microsoft.Graph及相关组件;另一个项目(ProjectB)是它的单元测试项目。在ProjectB中创建ProjectA的对象时,报错无法加载ProjectA引用的程序集。
ProjectA构造函数代码
public GraphApi(string tenantId, string clientId, string clientSecret) { string[] scopes = new[] { "https://graph.microsoft.com/.default" }; var clientSecretCredential = new ClientSecretCredential(tenantId, clientId, clientSecret); graphClient = new GraphServiceClient(clientSecretCredential, scopes); }
ProjectB测试方法代码
[TestMethod] public void GetGroups() { GraphApi graphApi = new GraphApi(TenantId, ClientId, Secret); }
报错信息
运行测试时,在ProjectA构造函数的var clientSecretCredential =...行抛出错误:
System.IO.FileNotFoundException: 'Could not load file or assembly 'Microsoft.Identity.Client, Version=4.57.0.0, Culture=neutral, PublicKeyToken=0a613f4dd989e8ae' or one of its dependencies. The system cannot find the file specified.'
Microsoft.Identity.Client已在ProjectA中引用,且版本与报错中的4.57.0.0一致:
我想确认是否是ProjectA的引用问题导致,而非需要在ProjectB中安装报错提及的包。请问问题原因是什么,该如何排查?
补充:最近刚把所有项目从C盘迁移到新的S盘,猜测可能和这个操作有关。
可能原因及排查步骤
- 项目迁移引发的路径/缓存问题
- 清理NuGet缓存:执行命令
dotnet nuget locals all --clear,之后重新还原所有项目的NuGet包 - 删除解决方案下所有项目的
bin和obj文件夹,重新生成整个解决方案 - 打开ProjectA的.csproj文件,检查
Microsoft.Identity.Client的引用路径,确认是否还残留旧的C盘路径,手动修正为S盘的正确路径
- 清理NuGet缓存:执行命令
- 依赖传递被阻断
- 检查ProjectA的.csproj文件中
Microsoft.Identity.Client的PackageReference配置,是否设置了PrivateAssets="all"这类限制依赖传递的属性,若有则移除该配置 - 在Package Manager Console中执行
Update-Package -reinstall Microsoft.Identity.Client,强制修复ProjectA中的包引用
- 检查ProjectA的.csproj文件中
- 测试环境的程序集复制问题
- 查看ProjectB的测试输出目录(如
bin/Debug/netX.x),确认是否存在Microsoft.Identity.Client.dll文件。如果没有,说明依赖未被自动复制到测试目录 - 可以临时在ProjectB中添加同版本的
Microsoft.Identity.Client包,若问题解决,说明传递依赖确实存在问题,再回头排查ProjectA的引用配置
- 查看ProjectB的测试输出目录(如
- 程序集版本绑定冲突
- 检查解决方案中的
app.config或web.config文件,查看是否存在assemblyBinding节点的版本重定向配置,确认是否引发了版本冲突
- 检查解决方案中的
- 磁盘权限限制
- 新的S盘可能存在权限限制,导致测试进程无法读取该路径下的程序集。尝试以管理员身份运行Visual Studio,重新执行测试
内容的提问来源于stack exchange,提问作者Sigmundur
相关产品推荐
相关产品推荐

