使用 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 代码分析在引用的程序集中查找符号的主要内容,如果未能解决你的问题,请参考以下文章