如何在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
相关产品推荐
相关产品推荐

