Visual Studio 2026新扩展框架:工具窗口无需触发命令获取IClientContext
获取VS2026新扩展框架工具窗口中的IClientContext
在Visual Studio 2026的新扩展框架中,工具窗口无需依赖命令触发,可通过注入核心服务直接获取IClientContext,具体实现步骤如下:
1. 注入IVisualStudioExtensibility服务
在工具窗口类的构造函数中,注入框架核心服务IVisualStudioExtensibility,它是与Visual Studio交互的入口。
2. 调用GetClientContextAsync获取上下文
通过IVisualStudioExtensibility的GetClientContextAsync方法,结合ClientContextFilter指定所需的上下文范围(如活动文档、项目、光标位置等),即可获取目标IClientContext。
完整代码示例
using Microsoft.VisualStudio.Extensibility; using Microsoft.VisualStudio.Extensibility.ToolWindows; using System.Threading; using System.Threading.Tasks; [VisualStudioContribution] public class MyToolWindow : ToolWindow { private readonly IVisualStudioExtensibility _extensibility; // 构造函数注入核心服务 public MyToolWindow(IVisualStudioExtensibility extensibility) { _extensibility = extensibility; } // 示例:获取当前活动上下文并处理 public async Task ProcessActiveContextAsync(CancellationToken cancellationToken) { // 指定筛选器:获取包含活动文档、项目和光标选区的上下文 var contextFilter = ClientContextFilter.WithDocumentAndSelection(); // 获取IClientContext实例 var clientContext = await _extensibility.GetClientContextAsync(contextFilter, cancellationToken); // 读取活动文档路径 string activeDocPath = clientContext.Properties.TryGetValue("ActiveDocumentFullPath", out var pathVal) ? pathVal.ToString() : null; // 读取活动项目名称 string activeProjectName = clientContext.Properties.TryGetValue("ActiveProjectName", out var projVal) ? projVal.ToString() : null; // 读取光标位置(行/列) if (clientContext.Properties.TryGetValue("SelectionStartLine", out var lineVal) && clientContext.Properties.TryGetValue("SelectionStartColumn", out var colVal)) { int cursorLine = int.Parse(lineVal.ToString()); int cursorColumn = int.Parse(colVal.ToString()); // 此处执行针对活动项目/光标位置的业务逻辑 } } // 工具窗口初始化时可调用上下文获取方法 public override async Task InitializeAsync(CancellationToken cancellationToken) { await base.InitializeAsync(cancellationToken); await ProcessActiveContextAsync(cancellationToken); } }
补充说明
ClientContextFilter提供多种预设筛选器:WithDocument()(仅活动文档)、WithProject()(仅活动项目)、WithDocumentAndSelection()(文档+光标选区)等,按需选择可减少不必要的数据获取。- 若需实时监听上下文变化(如切换活动文档、光标移动),可实现
IClientContextChangedNotification接口订阅变更事件。
内容的提问来源于stack exchange,提问作者Danhol86
相关产品推荐
相关产品推荐

