Reputation: 3616
I am writing a customization package for Visual Studio 2010 (vsix).
What I need to do is to add a context menu button to the Project nodes in Solution Explorer.
I've managed to get the context menu to appear when right-clicking the Project nodes, but my next challenge is to get a reference to the Project object that's been clicked. Currently I am able to get the project by going through the active document in the IDE using the code below.
DTE dte = (DTE)ServiceProvider.GlobalProvider.GetService(typeof(DTE));
Project project = dte.ActiveDocument.ProjectItem.ContainingProject;
So my question is: how do I get a similar reference to the project selected in the solution explorer?
Upvotes: 6
Views: 3455
Reputation: 3616
I figured it out. Might as well share the info.
By using the SVsShellMonitorSelection
service I can get a reference to the selected hierarchy as a IVsHierarchy
, which in turn allows me to get a reference to the selected object. This may then be cast to classes such as Project
, ProjectItem
, etc, based on what is selected in the Solution Explorer. Handy!
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;
Upvotes: 12