You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 03:09:14