C# Roslyn:获取在第三方库中定义的类型的符号

C# Roslyn:获取在第三方库中定义的类型的符号,c#,roslyn,C#,Roslyn,使用Roslyn/Microsoft.CodeAnalysis,如何获取第三方类型的ISymbol,即在引用程序集中定义的不属于解决方案的类型? 在我的特殊情况下,我正在寻找JSON.NET的JObject,但实际上同样的问题也适用于BCL,比如StringBuilder等 到目前为止,我唯一想到的是实现一个CSharpSyntaxWalker,它查找所有的方法调用、属性访问和构造函数调用,检查它们是否在我感兴趣的类型上进行,如果是,则从相应的SyntaxNode获取符号。 我现在就要实现它,但

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

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


可能是关于背景:我试图用另一个类的用法替换JObject的用法。

如果您可以访问
编译
,您可以调用并传递符号的完全限定元数据名称

小心嵌套类和泛型,它们的元数据名称不同于普通的完全限定名。有关更多信息,请参阅:


一旦你有了这个符号,你就可以通过

找到所有用法,完全限定的名称应该是类似于
Newtonsoft.Json.Linq.JObject
,对吗?在加载的解决方案中查看特定项目是否相关?现在我做:
project.GetCompilationAsync().Result.GetTypeByMetadataName(typeName)使用上述完全限定名称。我得到空:/(解决方案在VS中构建得很好)(顺便说一句,你的博客在我在Roslyn的旅程中是非常宝贵的!感谢你写这些文章!)这应该是正确的名字。你是如何得到解决方案的?通过
VisualStudioWorkspace
MSBuildWorkspace
或其他方式?检查
compilation.GetDiagnostics()
是否未返回任何错误。(很高兴他们帮了忙,听到这个消息总是很高兴!)事实上,我只是这样做:
var workspace=MSBuildWorkspace.Create();var project=workspace.OpenProjectAsync(mInputProjectPath).Result-但该项目是解决方案的一部分。(只是我只需要在那个特定的项目上执行工作)。我将研究.GetDiagnostics().hmm。诊断有很多错误,如“预定义类型System.void未定义…”。我使用的是VS 2015+.NET 4.6,但目标项目是VS 2013+.NET 4.5解决方案,这可能与此相关吗?