2012-06-15 8 views
5

Estoy escribiendo un paquete de personalización para Visual Studio 2010 (vsix).Proyecto seleccionado de Solution Explorer

Lo que necesito hacer es agregar un botón de menú contextual a los nodos del Proyecto en el Explorador de soluciones.

He logrado que aparezca el menú contextual al hacer clic con el botón derecho en los nodos Proyecto, pero mi siguiente desafío es obtener una referencia al objeto Proyecto que se ha hecho clic. Actualmente puedo obtener el proyecto pasando por el documento activo en el IDE usando el siguiente código.

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

Así que mi pregunta es: ¿cómo obtengo una referencia similar al proyecto seleccionado en el explorador de soluciones?

Respuesta

11

Me di cuenta. Bien podría compartir la información.

Al utilizar el servicio SVsShellMonitorSelection puedo obtener una referencia a la jerarquía seleccionada como IVsHierarchy, que a su vez me permite obtener una referencia al objeto seleccionado. Esto se puede convertir a clases como Project, ProjectItem, etc., según lo que se seleccione en el Explorador de soluciones. ¡Práctico!

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

+0

Estoy encantada de haber encontrado esto, no se podía encontrar en cualquier otro lugar fuera de cómo hacer esto. : D – bio595

+1

Creo que le falta 'Marshal.Release (hierarchyPtr); Marshal.Release (selectionContainerPointer); 'al final para evitar una pérdida de memoria. De lo contrario genial! – MickyD

+0

Esto podría ser obvio, pero como usuario novato de IntPtr, vale la pena señalar que puede marcar selectionContainerPointer == IntPtr.Zero antes de llamar a Marshal.Lívelo para evitar una excepción de puntero nulo. – webjprgm

Cuestiones relacionadas