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

6
我正在编写一个Visual Studio 2010(vsix)的自定义包。我需要做的是在“解决方案资源管理器”中为项目节点添加上下文菜单按钮。我已经成功使上下文菜单在右键单击项目节点时出现,但我的下一个挑战是获取被点击的“项目”对象的引用。目前,我可以通过以下代码在IDE中遍历活动文档来获取项目。
DTE dte = (DTE)ServiceProvider.GlobalProvider.GetService(typeof(DTE));
Project project = dte.ActiveDocument.ProjectItem.ContainingProject;

所以我的问题是:如何在解决方案资源管理器中选择项目并得到类似的参考?
1个回答

12

我搞明白了,不妨分享一下信息。

通过使用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;

这里是来源


我很高兴找到了这个,其他地方都找不到怎么做。 :D - bio595
1
我认为你在结尾处缺少了 Marshal.Release(hierarchyPtr); Marshal.Release(selectionContainerPointer); 以避免内存泄漏。除此之外,非常棒! - user585968
这可能很明显,但作为IntPtr的新手用户,值得指出的是,在调用Marshal.Release之前,您可以检查selectionContainerPointer == IntPtr.Zero以避免空指针异常。 - webjprgm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接