我正在为Visual Studio 2010(vsix)编写自定义程序包。
我需要做的是在“解决方案资源管理器”中的“项目”节点上添加一个上下文菜单按钮。
右键单击Project节点时,我设法使上下文菜单出现,但是我的下一个挑战是获取对已单击的Project对象的引用。目前,我可以使用下面的代码通过IDE中的 Activity 文档来获取项目。
DTE dte = (DTE)ServiceProvider.GlobalProvider.GetService(typeof(DTE));
Project project = dte.ActiveDocument.ProjectItem.ContainingProject;
所以我的问题是:如何获得对在解决方案资源管理器中选择的项目的类似引用?
最佳答案
我想到了。最好也共享信息。
通过使用SVsShellMonitorSelection
服务,我可以作为IVsHierarchy
获得对所选层次结构的引用,这又使我可以获得对所选对象的引用。然后,可以根据“解决方案资源管理器”中选择的内容将其强制转换为诸如Project
,ProjectItem
等类。便利!
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