如何用C#在Visual Studio 2017扩展中获取选中项目名称
获取Visual Studio 2017中当前选中项目的名称(C#扩展)
我之前做VS扩展开发时也碰到过这个需求,在VS2017里用C#实现其实很直接,核心是借助Visual Studio的**DTE(Development Tools Environment)**对象来访问解决方案和项目模型,下面是具体的实现步骤和代码:
1. 引用必要的程序集
首先确保你的扩展项目已经引用了EnvDTE和EnvDTE80这两个程序集——VS2017的扩展项目通常会自动添加,但如果没有的话,可以右键项目→添加→引用→程序集→框架,找到并勾选这两个组件。
2. 获取DTE实例
在VSPackage或者命令处理类中,通过GetService方法获取DTE对象,这是访问VS项目系统的入口:
using EnvDTE; using EnvDTE80; using System.Windows.Forms; // 如果要弹窗测试的话需要这个 // 在VSPackage类中获取DTE DTE dte = (DTE)this.GetService(typeof(DTE)); if (dte == null) { MessageBox.Show("无法获取DTE实例"); return; }
如果是在菜单命令的回调方法中,获取方式类似:
private void MenuItemCallback(object sender, EventArgs e) { // 假设你有ServiceProvider实例 DTE dte = (DTE)ServiceProvider.GetService(typeof(DTE)); if (dte == null) return; // 后续逻辑... }
3. 获取当前选中的项目
通过DTE的SelectedItems集合遍历选中项,区分两种场景:直接选中项目本身,或者选中项目内的文件/文件夹:
SelectedItems selectedItems = dte.SelectedItems; foreach (SelectedItem item in selectedItems) { // 场景1:直接选中了项目节点 if (item.Project != null) { string projectName = item.Project.Name; MessageBox.Show($"当前选中的项目名称:{projectName}"); break; // 如果只需要第一个选中的项目,这里可以break;多选的话可以收集所有项目名 } // 场景2:选中了项目里的文件或文件夹,需要获取其所属项目 else if (item.ProjectItem != null && item.ProjectItem.ContainingProject != null) { string projectName = item.ProjectItem.ContainingProject.Name; MessageBox.Show($"当前选中项所属的项目名称:{projectName}"); break; } }
额外提示
- 如果你的扩展需要支持多选项目的场景,可以去掉
break,把所有符合条件的项目名收集到一个列表里。 - 注意空值判断,避免因为选中的是解决方案节点或者其他非项目元素导致空引用异常。
内容的提问来源于stack exchange,提问作者ritu
相关产品推荐
相关产品推荐

