在roslyn中访问VS完整解决方案

Accessing VS complete solution in roslyn

我们如何从 Roslyn 中的代码分析器访问完整的 visual studio 解决方案?

我一直在尝试语义分析,但没有太多帮助。

var sol = ((Microsoft.CodeAnalysis.Diagnostics.WorkspaceAnalyzerOptions)context.Options)
    .Workspace.CurrentSolution;

这是我使用 intellisense 想到的,但这总是给出一个 null 值。

一般来说,你不能。分析器 运行 作为 csc 和 vbc 中命令行构建的一部分,没有工作区或解决方案的概念。

我们正在考虑添加一个 VS 特定的分析器 API 以允许访问 Solution,但是对于 Roslyn 的 1.0 版本,没有支持的方法来这样做。

暂时 WorkspaceAnalyzerOptionsinternal sealed。可以将 context.Optionsreflection 一起使用。 Hacky,但有效。

Solution solution =
    ((HostWorkspaceServices)context
    .Options
    .GetType()
    .GetRuntimeProperty("Services")
    .GetValue(context.Options))
    .Workspace
    .CurrentSolution;

注意,编译器会给出警告:

RS1022 Change diagnostic analyzer type to remove all direct accesses to type(s) 'Microsoft.CodeAnalysis.Host.HostWorkspaceServices, Microsoft.CodeAnalysis.Solution, Microsoft.CodeAnalysis.Workspace'