解决方案资源管理器

解决方案资源管理器

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

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

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

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;

Here's the source

09-25 18:31