2012-06-15 6 views
5

Ich schreibe ein Anpassungspaket für Visual Studio 2010 (vsix).Ausgewähltes Projekt aus dem Projektmappen-Explorer

Ich muss den Projektknoten im Projektmappen-Explorer eine Kontextmenüschaltfläche hinzufügen.

Ich habe es geschafft, dass das Kontextmenü angezeigt wird, wenn ich mit der rechten Maustaste auf die Projektknoten klicke, aber meine nächste Herausforderung besteht darin, einen Verweis auf das Projektobjekt zu erhalten. Momentan kann ich das Projekt bekommen, indem ich das aktive Dokument in der IDE mit dem folgenden Code durchführe.

Also meine Frage ist: Wie bekomme ich einen ähnlichen Verweis auf das Projekt im Solution Explorer ausgewählt?

Antwort

11

Ich habe es herausgefunden. Könnte auch die Informationen teilen.

Mit dem SVsShellMonitorSelection Service kann ich einen Verweis auf die ausgewählte Hierarchie als IVsHierarchy erhalten, die wiederum ermöglicht, einen Verweis auf das ausgewählte Objekt zu erhalten. Dies kann dann in Klassen wie Project, ProjectItem usw. umgewandelt werden, basierend auf dem, was im Projektmappen-Explorer ausgewählt wurde. Praktisch!

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

Ich bin so glücklich, dass ich diese gefunden, finden konnte nirgendwo anders aus, wie dies zu tun. : D – bio595

+1

Ich denke, du vermisst 'Marshal.Release (hierarchyPtr); Marshal.Release (selectionContainerPointer); 'am Ende, um ein Speicherleck zu vermeiden. Sonst großartig! – MickyD

+0

Dies kann offensichtlich sein, aber als ein Anfänger Benutzer von IntPtr ist es wert darauf hinzuweisen, dass Sie selectionContainerPointer == IntPtr.Zero vor dem Aufruf von Marshal.Release überprüfen können, um eine Nullzeiger Ausnahme zu vermeiden. – webjprgm