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

Posted

技术标签:

【中文标题】使用 Roslyn 代码分析在引用的程序集中查找符号【英文标题】:Finding a symbol in a referenced assembly using Roslyn Code Analysis 【发布时间】:2021-12-16 06:40:34 【问题描述】:

需要在所分析的编译的引用程序集中搜索具有指定类名的类型,无论它位于哪个命名空间中。

基本上我需要一个函数来搜索引用的程序集,就像下面的方法搜索正在分析的编译一样。

context.SemanticModel.Compilation.GetSymbolsWithName(classNameToFind, SymbolFilter.Type);

有没有办法使用程序集名称加载编译抽象?只要我不必使用反射,我就可以使用粗略的方法......这样我就可以继续使用 ISymbol。

【问题讨论】:

我也尝试使用 context.SemanticModel.Compilation.SourceModule.ReferencedAssemblySymbols.SelectMany(x => x.TypeNames) 但类型名不完全限定。 【参考方案1】:

我认为我们没有为此提供特殊的 API;你可以去编译的 GlobalNamespace 并手动遍历命名空间/类型层次结构。

【讨论】:

你好@Jason Malinowski。感谢您的回答....但是您能否更具体一点,因为我在那里找不到任何有用的东西。我能想到的唯一机制就是使用反射分析程序集(我这里主要是怕手动加载依赖程序集),然后找到我需要的类型的全限定名,然后使用context.SemanticModel获取符号。 Compilation.GetTypeByMetadataName(x). @Kilo7:一旦获得全局命名空间,您就可以递归调用GetNamespaceMembers 以获取所有命名空间,然后在每个命名空间上调用GetTypeMembers 以获取与该名称匹配的类型。 而且你不使用反射是正确的:Roslyn 在这里有自己的模型,你可以使用它来避免头痛。

以上是关于使用 Roslyn 代码分析在引用的程序集中查找符号的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Roslyn

Roslyn 如何获得一个类的引用

基于 Roslyn 实现代码动态编译

访问修饰符