2012-06-15 19 views
5

Piszę pakiet dostosowywania dla Visual Studio 2010 (vsix).Wybrany projekt z Solution Explorer

Co należy zrobić, to dodać przycisk menu kontekstowego do węzłów projektu w Eksploratorze rozwiązań.

Udało mi się uzyskać menu kontekstowe, które pojawi się po kliknięciu prawym przyciskiem myszy węzła projektu, ale moim następnym wyzwaniem jest uzyskanie odwołania do klikniętego obiektu projektu. Obecnie jestem w stanie uzyskać projekt, przechodząc przez aktywny dokument w IDE za pomocą poniższego kodu.

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

Moje pytanie brzmi: jak uzyskać podobne odniesienie do projektu wybranego w eksploratorze rozwiązań?

Odpowiedz

11

Wymyśliłem to. Równie dobrze może dzielić się informacją.

Korzystając z usługi SVsShellMonitorSelection mogę uzyskać odniesienie do wybranej hierarchii jako IVsHierarchy, co z kolei pozwala mi uzyskać odniesienie do wybranego obiektu. Może to następnie zostać przeniesione do klas, takich jak Project, ProjectItem itd., W oparciu o to, co jest wybrane w Eksploratorze rozwiązań. Poręczny!

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

Jestem tak szczęśliwy, znalazłem to, nie mógł znaleźć się w innym miejscu, jak to zrobić. : D – bio595

+1

Myślę, że brakuje Ci 'Marshal.Release (hierarchyPtr); Marshal.Release (selectionContainerPointer); 'na końcu, aby uniknąć wycieku pamięci. W przeciwnym razie świetnie! – MickyD

+0

To może być oczywiste, ale jako początkujący użytkownik IntPtr warto zauważyć, że przed wywołaniem Marshal można sprawdzić selectionContainerPointer == IntPtr.Zero, aby uniknąć wyjątku wskaźnika pustego. – webjprgm

Powiązane problemy