You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Visual Studio 2019扩展开发监听类变更实现自定义类视图方向

Visual Studio 2019 类视图扩展实现方案

全量扫描解决方案类的实现方式

  • 引用 Microsoft.VisualStudio.LanguageServices NuGet 包,这是Visual Studio与Roslyn编译器平台交互的官方封装
  • 通过VS内置服务获取Roslyn工作区实例:
    var workspace = await VS.GetServiceAsync<SVsWorkspace, VisualStudioWorkspace>();
    
  • 遍历当前解决方案下的所有项目,逐个获取编译对象后提取类信息:
    foreach (var project in workspace.CurrentSolution.Projects)
    {
        var compilation = await project.GetCompilationAsync();
        // 递归遍历命名空间下的所有类
        var allClasses = compilation.GlobalNamespace
            .GetMembers()
            .OfType<INamespaceSymbol>()
            .SelectMany(ns => ns.GetAllMembers().OfType<INamedTypeSymbol>())
            .Where(t => t.TypeKind == TypeKind.Class);
    }
    
    拿到的INamedTypeSymbol包含类的完整信息,包括命名空间、继承关系、成员、所在文件位置等,可直接用于构造树结构节点。

源文件变更实时同步的实现方式

不需要自行监听文件系统事件,直接使用Roslyn工作区提供的变更事件即可覆盖所有场景:

  • 为VisualStudioWorkspace.WorkspaceChanged事件注册回调,该事件会触发所有解决方案层级的变更通知,包括项目增删、文件增删、文件内容修改
  • 根据事件参数的Kind字段做增量处理:
    • 变更类型为DocumentAdded/DocumentRemoved:对应源文件新增/删除,单独处理对应文档的类信息即可
    • 变更类型为DocumentChanged:对应源文件内容修改,重新解析该文档的语法树,提取类信息后更新你的树结构
    • 变更类型为ProjectAdded/ProjectRemoved:对应项目增删,全量更新对应项目下的类节点即可

注意事项

  • 所有Roslyn API的调用建议在后台线程执行,避免阻塞VS主线程造成卡顿
  • 可以用类的完整限定名(命名空间+类名)作为唯一键,方便增量更新时快速匹配节点
  • 工具窗口的树结构如果用WPF实现,建议绑定ObservableCollection层级结构,变更时直接更新集合即可自动刷新UI

内容的提问来源于stack exchange,提问作者Dmitry Arestov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:45:04