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

如何在Roslyn分析器中获取直接引用项目?使用Compilation.ReferencedAssembly存疑

如何在Roslyn分析器中获取直接项目引用()

你没搞错Compilation.ReferencedAssemblies的问题——它确实会返回所有参与编译的程序集标识,包括直接引用和传递依赖的程序集。因为Roslyn的Compilation对象是整个编译上下文的抽象,不是单个项目.csproj配置的快照,所以它会把所有最终参与编译的程序集都列出来,不管是直接声明的还是间接依赖的。

要拿到.csproj里显式写的<ProjectReference>直接引用,得换个思路:

  • Roslyn分析器可以通过Compilation关联到对应的Project对象(适用于项目级分析场景)
  • 直接访问Project.ProjectReferences属性,这个集合就是当前项目在.csproj中声明的所有直接项目引用,完全不会包含传递依赖。

给个简单的实现示例:

public override void Initialize(AnalysisContext context)
{
    context.EnableConcurrentExecution();
    context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);

    context.RegisterCompilationAction(ctx =>
    {
        var currentProject = ctx.Compilation.Project;
        if (currentProject == null) return;

        // 遍历当前项目的所有直接ProjectReference
        foreach (var projectRef in currentProject.ProjectReferences)
        {
            var referencedProject = currentProject.Solution.GetProject(projectRef.ProjectId);
            if (referencedProject == null) continue;

            // 在这里检查目标项目的配置是否符合要求
            var targetProjectName = referencedProject.Name;
            // 示例:检查目标项目是否包含指定配置项
            var hasRequiredConfig = referencedProject.Properties.TryGetValue("YourRequiredConfigKey", out _);
            if (!hasRequiredConfig)
            {
                // 触发诊断提示
                ctx.ReportDiagnostic(Diagnostic.Create(
                    YourDiagnosticRule,
                    Location.None,
                    targetProjectName));
            }
        }
    });
}

需要注意的细节:

  • 这种方式依赖Roslyn的Workspace/Solution/Project模型,只有在分析器能访问完整解决方案上下文时才生效(比如VS内运行的分析器,而非纯编译期的独立分析)
  • 如果是CI环境里的纯编译阶段分析,无法直接拿到Project对象,这时可能需要通过编译元数据引用的特定标识(比如程序集的自定义属性)来区分直接/传递引用,但这种方式不如直接访问ProjectReference可靠。

内容的提问来源于stack exchange,提问作者WAKU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:53:12