【问题标题】:Roslyn: get the symbol for a type defined in a third-party libraryRoslyn:获取第三方库中定义的类型的符号
【发布时间】:2015-10-27 17:32:46
【问题描述】:

使用 Roslyn/Microsoft.CodeAnalysis,我如何获取第三方类型的 ISymbol,即在不属于解决方案的引用程序集中定义的类型? 在我的特殊情况下,我正在寻找 JSON.NET 的 JObject,但实际上同样的问题对于像 StringBuilder 等 BCL 的东西也是有效的。

到目前为止,我提出的唯一想法是实现一个 CSharpSyntaxWalker,它会查找所有方法调用、属性访问和构造函数调用,检查它们是否是在我感兴趣的类型上创建的,如果是,则获取来自相应 SyntaxNode 的符号。 我现在要实现这个,但它看起来非常麻烦。我认为必须有更好的方法,但我的 google-fu 没有产生任何相关结果。

也许关于背景:我正在尝试用另一个类的用法替换 JObject 的用法。

【问题讨论】:

    标签: c# roslyn


    【解决方案1】:

    如果您可以访问 Compilation,则可以调用 Compilation.GetTypeByMetadataName() 并传入符号的完全限定元数据名称。

    注意嵌套类和泛型,它们的元数据名称不同于正常的完全限定名称。更多内容见:Having a "+" in the class name?

    获得符号后,您可以通过SymbolFinder.FindAllReferences()找到所有用法

    【讨论】:

    • 完全限定名称类似于Newtonsoft.Json.Linq.JObject,对吗?我在加载的解决方案中查看特定项目是否相关?现在我这样做:project.GetCompilationAsync().Result.GetTypeByMetadataName(typeName); 使用上述完全限定名称。我得到 null :/ (该解决方案在 VS 中构建得很好。)
    • (顺便说一句,您的博客对我在 Roslyn 的旅途中非常宝贵!感谢您撰写这些文章!)
    • 这应该是正确的名称。您如何获得解决方案?通过VisualStudioWorkspaceMSBuildWorkspace 什么的?检查compilation.GetDiagnostics() 是否没有返回任何错误。 (很高兴他们提供了帮助,听到这个消息总是很高兴!)
    • 实际上,我只是这样做:var workspace = MSBuildWorkspace.Create(); var project = workspace.OpenProjectAsync(mInputProjectPath).Result; - 但该项目是解决方案的一部分。 (只是我只需要在该特定项目上执行工作)。我将研究 .GetDiagnostics()。
    • 嗯。诊断有很多错误,例如“预定义类型 System.void 未定义...”。我使用的是 VS 2015 + .NET 4.6,但目标项目是 VS 2013 + .NET 4.5 解决方案是否相关?
    猜你喜欢
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多