在 Roslyn 分析器/源生成器中,有啥方法可以区分直接和传递程序集引用

Posted

技术标签:

【中文标题】在 Roslyn 分析器/源生成器中,有啥方法可以区分直接和传递程序集引用【英文标题】:In a Roslyn Analyzer/Source Generator, is there any way to distinguish between direct and transitive assembly references在 Roslyn 分析器/源生成器中,有什么方法可以区分直接和传递程序集引用 【发布时间】:2021-11-30 23:54:20 【问题描述】:

AIUI,传递引用是 MSBuild 而不是 Roslyn 功能,并且与 Package/ProjectReferences 而不是程序集引用有关。我相信编译器只是得到一组提供给它的程序集引用,没有关于它们来自哪里的信息。结果,我看不出有任何方法可以区分分析器或源生成器中的直接引用和传递引用(即给定 CodeAnalysis.Compilation 对象)。 Compilation.References 包括传递的,Compilation.ReferencedAssemblyNames 也是如此。

有人知道获取这些信息的方法吗?是否有可能获得一个 MsBuild Project 对象,从中可以收集到它?

【问题讨论】:

【参考方案1】:

无法获取此信息;正如您所观察到的,MSBuild 正在这样做,而当 Roslyn 获得信息时,它只是一个平面列表。由于各种技术原因,我们无法返回到 MSBuild 实例。如果您澄清了为什么需要此功能,我们或许可以为后续步骤提供一些建议。

【讨论】:

以上是关于在 Roslyn 分析器/源生成器中,有啥方法可以区分直接和传递程序集引用的主要内容,如果未能解决你的问题,请参考以下文章

RyuJIT 和 Roslyn 有啥区别?

Roslyn Source Generator 未在 .net 框架 4.7.2 中生成任何源

从 Roslyn 代码分析器调用分析程序集的方法

.NET CoreCLR、CoreRT、Roslyn 和 LLILC 有啥区别

roslyn能生成枚举吗?

使用 Roslyn 代码分析在引用的程序集中查找符号