VS2017自定义工具窗口扩展:获取项目位置与加载解决方案方法咨询
解决VS 2017自定义工具窗口扩展的两个问题
嗨,我来帮你搞定这两个困扰你的VS扩展开发问题!先从你卡住的ShellSettingsManager实例化说起——你完全不需要自己实现IVsSettingsManager或IServiceProvider接口,VS扩展框架已经给我们准备好了现成的服务实例,直接用就行。
一、获取“工具/选项/项目和解决方案/位置”里的项目位置
首先,确保你的工具窗口类继承自ToolWindowPane,它自带的Package属性就是一个有效的IServiceProvider,用它来实例化ShellSettingsManager就对了。具体步骤和代码如下:
- 引入必要的命名空间:
using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Settings;
- 在工具窗口的初始化代码中(比如
OnToolWindowCreated方法),获取项目位置:
protected override void OnToolWindowCreated() { base.OnToolWindowCreated(); // 正确实例化ShellSettingsManager var settingsManager = new ShellSettingsManager(this.Package); // 获取用户级别的只读设置存储 var userSettingsStore = settingsManager.GetReadOnlySettingsStore(SettingsScope.UserSettings); // 读取项目位置设置(键名是"ProjectsLocation",所属类别是"ProjectLocations") string projectsLocation = userSettingsStore.GetString("ProjectLocations", "ProjectsLocation"); // 现在projectsLocation就是你要的路径了,可以用来做后续逻辑 }
二、让当前VS实例加载解决方案或项目
这个需求可以通过IVsSolution接口来实现,同样通过Package获取这个服务实例即可。代码示例如下:
- 引入必要的命名空间:
using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop;
- 加载解决方案或项目的代码:
// 获取IVsSolution服务实例 var vsSolution = this.Package.GetService(typeof(SVsSolution)) as IVsSolution; if (vsSolution != null) { // 示例1:加载解决方案 string solutionPath = @"C:\Path\To\Your\Solution.sln"; // SLNOPENOPT_DontAddToRecent表示不添加到最近打开列表,可根据需求调整枚举值 int result = vsSolution.OpenSolutionFile((uint)__VSSLNOPENOPTIONS.SLNOPENOPT_DontAddToRecent, solutionPath); // 示例2:加载单个项目 string projectPath = @"C:\Path\To\Your\Project.csproj"; Guid projectTypeGuid = Guid.Empty; // 不需要指定项目类型时传Empty即可 IVsHierarchy projectHierarchy; int projectResult = vsSolution.OpenProject(projectPath, ref projectTypeGuid, out projectHierarchy); }
补充说明
你之前尝试自己实现IVsSettingsManager或IServiceProvider是走了弯路——VS的扩展框架中,Package(或者AsyncPackage)已经内置了这些服务的实现,我们只需要通过GetService方法获取对应的接口实例就行,不用自己去写那些空实现的方法。
内容的提问来源于stack exchange,提问作者tolsen64
相关产品推荐
相关产品推荐

