从解决方案资源管理器中选择的项目

本文关键字:项目 选择 解决方案 资源管理器 | 更新日期: 2023-09-27 18:37:13

我正在为 Visual Studio 2010 (vsix) 编写一个自定义包。

我需要做的是向解决方案资源管理器中的项目节点添加一个上下文菜单按钮。

我已经设法在右键单击项目节点时显示上下文菜单,但我的下一个挑战是获取对已单击的 Project 对象的引用。目前,我可以使用下面的代码通过IDE中的活动文档来获取项目。

DTE dte = (DTE)ServiceProvider.GlobalProvider.GetService(typeof(DTE));
Project project = dte.ActiveDocument.ProjectItem.ContainingProject;

所以我的问题是:如何获得对解决方案资源管理器中选择的项目的类似引用?

从解决方案资源管理器中选择的项目

我想通了。不妨分享一下信息。

通过使用SVsShellMonitorSelection服务,我可以获取对所选层次结构的引用作为IVsHierarchy,这反过来又允许我获取对所选对象的引用。然后,可以根据在解决方案资源管理器中选择的内容将其强制转换为类,例如ProjectProjectItem等。方便!

IntPtr hierarchyPointer, selectionContainerPointer;
Object selectedObject  = null;
IVsMultiItemSelect multiItemSelect;
uint projectItemId;
IVsMonitorSelection monitorSelection = 
        (IVsMonitorSelection)Package.GetGlobalService(
        typeof(SVsShellMonitorSelection));
monitorSelection.GetCurrentSelection(out hierarchyPointer, 
                                     out projectItemId, 
                                     out multiItemSelect, 
                                     out selectionContainerPointer);
IVsHierarchy selectedHierarchy = Marshal.GetTypedObjectForIUnknown(
                                     hierarchyPointer, 
                                     typeof(IVsHierarchy)) as IVsHierarchy;
if (selectedHierarchy != null)
{
    ErrorHandler.ThrowOnFailure(selectedHierarchy.GetProperty(
                                      projectItemId,
                                      (int)__VSHPROPID.VSHPROPID_ExtObject, 
                                      out selectedObject));
}
Project selectedProject = selectedObject as Project;

这是来源