2012-06-15 17 views
5

Sto scrivendo un pacchetto di personalizzazione per Visual Studio 2010 (vsix).Progetto selezionato da Solution Explorer

Quello che devo fare è aggiungere un pulsante del menu di scelta rapida ai nodi Progetto in Esplora soluzioni.

Sono riuscito a visualizzare il menu di scelta rapida facendo clic con il pulsante destro sui nodi Progetto, ma la mia prossima sfida è ottenere un riferimento all'oggetto Progetto che è stato selezionato. Attualmente sono in grado di ottenere il progetto passando attraverso il documento attivo nell'IDE utilizzando il codice seguente.

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

Quindi la mia domanda è: come faccio a ottenere un riferimento simile al progetto selezionato in Solution Explorer?

risposta

11

L'ho capito. Potrebbe anche condividere le informazioni.

Utilizzando il servizio SVsShellMonitorSelection, è possibile ottenere un riferimento alla gerarchia selezionata come IVsHierarchy, che a sua volta consente di ottenere un riferimento all'oggetto selezionato. Questo può quindi essere trasmesso a classi come Project, ProjectItem, ecc., In base a ciò che è selezionato in Esplora soluzioni. Maneggevole!

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

Sono così felice che ho trovato questo, non poteva sapere in qualsiasi altro luogo come fare questo. : D – bio595

+1

Penso che manchi 'Marshal.Release (hierarchyPtr); Marshal.Release (selectionContainerPointer); 'alla fine in modo da evitare perdite di memoria. Altrimenti fantastico! – MickyD

+0

Questo potrebbe essere ovvio, ma come utente principiante di IntPtr è importante sottolineare che è possibile selezionare selectionContainerPointer == IntPtr.Zero prima di chiamare Marshal.Rilascia su di esso per evitare un'eccezione di puntatore nullo. – webjprgm