Visual Studio 2019扩展开发监听类变更实现自定义类视图方向
Visual Studio 2019 类视图扩展实现方案
全量扫描解决方案类的实现方式
- 引用
Microsoft.VisualStudio.LanguageServicesNuGet 包,这是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
相关产品推荐
相关产品推荐

