.NET6程序如何获取解决方案内所有依赖项目的程序集
.NET 6 运行时获取解决方案内主项目及关联类库程序集方案
你观察到的编译生成的.deps.json是最准确的数据源,不需要手动解析JSON,使用官方提供的依赖上下文API即可完成精准筛选,实现逻辑如下:
前置准备
在主项目中安装Microsoft.Extensions.DependencyModel包,这是.NET官方提供的运行时依赖解析组件,无第三方依赖。
实现代码
using System.Reflection; using Microsoft.Extensions.DependencyModel; // 获取入口主程序集 Assembly entryAssembly = Assembly.GetEntryAssembly() ?? throw new InvalidOperationException("入口程序集获取失败"); // 加载当前应用的依赖上下文,自动读取对应deps.json配置 DependencyContext dependencyContext = DependencyContext.Load(entryAssembly) ?? throw new InvalidOperationException("依赖上下文加载失败"); List<Assembly> solutionProjectAssemblies = new() { entryAssembly }; // 遍历所有编译期依赖 foreach (CompilationLibrary library in dependencyContext.CompileLibraries) { // 仅筛选类型为Project的依赖:即解决方案内通过项目引用引入的类库 // 第三方NuGet包Type为Package,系统框架程序集Type为ReferenceAssembly,会被直接过滤 if (string.Equals(library.Type, "project", StringComparison.OrdinalIgnoreCase)) { solutionProjectAssemblies.Add(Assembly.Load(library.Name)); } }
方案优势
- 不会遗漏添加了项目引用、但未被主项目代码实际调用的类库:编译生成deps.json时,只要是解决方案内的项目引用,无论是否有实际代码调用,都会被标记为Project类型写入配置
- 无冗余数据:自动过滤系统框架、第三方NuGet包等无关程序集,最终返回结果就是主项目加所有同解决方案类库的程序集
- 兼容多种发布模式:官方API自动适配框架依赖部署、独立部署、单文件发布等不同场景的路径差异,不需要手动处理文件路径
扩展适配
如果需要把自有团队开发的NuGet包也纳入结果集,可以增加自定义匹配规则,比如按统一命名前缀筛选:
// 示例:追加匹配自有前缀的内部NuGet包 if (string.Equals(library.Type, "package", StringComparison.OrdinalIgnoreCase) && library.Name.StartsWith("MyOrg.", StringComparison.OrdinalIgnoreCase)) { solutionProjectAssemblies.Add(Assembly.Load(library.Name)); }
原有方案的问题说明
AppDomain.CurrentDomain.GetAssemblies()会返回所有已加载到应用域的程序集,包含系统运行时、动态生成的程序集、第三方组件,冗余数据过多Assembly.GetEntryAssembly().GetReferencedAssemblies()仅能返回被主程序集静态引用且实际触发加载的程序集,未被代码调用的项目引用不会出现在结果中,同时无法区分第三方包和自有项目
内容的提问来源于stack exchange,提问作者koishi
相关产品推荐
相关产品推荐

