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

VS2017自定义工具窗口扩展:获取项目位置与加载解决方案方法咨询

解决VS 2017自定义工具窗口扩展的两个问题

嗨,我来帮你搞定这两个困扰你的VS扩展开发问题!先从你卡住的ShellSettingsManager实例化说起——你完全不需要自己实现IVsSettingsManager或IServiceProvider接口,VS扩展框架已经给我们准备好了现成的服务实例,直接用就行。

一、获取“工具/选项/项目和解决方案/位置”里的项目位置

首先,确保你的工具窗口类继承自ToolWindowPane,它自带的Package属性就是一个有效的IServiceProvider,用它来实例化ShellSettingsManager就对了。具体步骤和代码如下:

  1. 引入必要的命名空间:
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Settings;
  1. 在工具窗口的初始化代码中(比如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获取这个服务实例即可。代码示例如下:

  1. 引入必要的命名空间:
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
  1. 加载解决方案或项目的代码:
// 获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:12:05