C# 在Visual Studio扩展中从ProjectItem获取Roslyn SemanticModel

C# 在Visual Studio扩展中从ProjectItem获取Roslyn SemanticModel,c#,visual-studio,visual-studio-2015,roslyn,vsx,C#,Visual Studio,Visual Studio 2015,Roslyn,Vsx,我正在编写一个Visual Studio 2015扩展,它查看用户右键单击的类的内容 我已经获得了项目项,但是如何从中获得语义模型(和语法树) 我需要查找文件中声明的某些类型的属性。我已经编写了一个代码分析器,它在上下文中为您提供语义模型,但我不知道如何在这里获得它。搜索没有找到任何有用的东西。我已经找到了如何通过读取文件内容来解析SyntaxTree,但是使用SemanticModel就不那么容易了。理想情况下,我会连接到VS已经为该文件构建的模型。找到了答案 将项目升级到目标.NET fra

我正在编写一个Visual Studio 2015扩展,它查看用户右键单击的类的内容

我已经获得了
项目项
,但是如何从中获得
语义模型
(和
语法树

我需要查找文件中声明的某些类型的属性。我已经编写了一个代码分析器,它在上下文中为您提供
语义模型
,但我不知道如何在这里获得它。搜索没有找到任何有用的东西。我已经找到了如何通过读取文件内容来解析
SyntaxTree
,但是使用
SemanticModel
就不那么容易了。理想情况下,我会连接到VS已经为该文件构建的模型。

找到了答案

  • 将项目升级到目标.NET framework 4.6.2
  • 安装
  • 将System.Collections.Immutable从1.2.0降级到1.1.37,否则稍后代码中将出现MissingMethodException
  • 在package类的
    Initialize
    方法中,获取VisualStudioWorkspace。我将其保存在此处的静态属性中,以便稍后获取:

    var componentModel = (IComponentModel)this.GetService(typeof(SComponentModel));
    VisualStudioWorkspace = componentModel.GetService<VisualStudioWorkspace>();
    

    是的,你应该有办法进入VisualStudioWorkspace。从工作区到FileCodeModel,我们有一些简单的助手,但奇怪的是,我不知道我们是否有另一种方法。只是想检查一下,您最初是从什么开始的,它为您提供了ProjectItem?@JasonMalinowski我在SolutionExplorer上的上下文菜单项中运行了一个命令。调用它时,我正在使用DTE2.ToolWindows.SolutionExplorer.SelectedItems,然后将对象属性强制转换为ProjectItem。
    Microsoft.CodeAnalysis.Solution solution = CreateUnitTestBoilerplateCommandPackage.VisualStudioWorkspace.CurrentSolution;
    DocumentId documentId = solution.GetDocumentIdsWithFilePath(inputFilePath).FirstOrDefault();
    var document = solution.GetDocument(documentId);
    
    SyntaxNode root = await document.GetSyntaxRootAsync();
    SemanticModel semanticModel = await document.GetSemanticModelAsync();