2012-06-15 19 views
5

Tôi đang viết một gói tùy chỉnh cho Visual Studio 2010 (vsix).Dự án được chọn từ Solution Explorer

Điều tôi cần làm là thêm nút menu ngữ cảnh vào nút Dự án trong Solution Explorer.

Tôi đã quản lý để trình đơn ngữ cảnh xuất hiện khi nhấp chuột phải vào nút Project, nhưng thử thách tiếp theo của tôi là lấy tham chiếu đến đối tượng Project đã được nhấp. Hiện tại tôi có thể lấy dự án bằng cách xem qua tài liệu đang hoạt động trong IDE bằng cách sử dụng mã bên dưới.

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

Vì vậy, câu hỏi của tôi là: làm cách nào để có tham chiếu tương tự với dự án được chọn trong trình khám phá giải pháp?

Trả lời

11

Tôi đã tìm ra. Cũng có thể chia sẻ thông tin.

Bằng cách sử dụng dịch vụ SVsShellMonitorSelection tôi có thể tham chiếu đến cấu trúc phân cấp đã chọn dưới dạng IVsHierarchy, từ đó cho phép tôi tham chiếu đến đối tượng đã chọn. Điều này sau đó có thể được truyền tới các lớp như Project, ProjectItem, v.v., dựa trên những gì được chọn trong Solution Explorer. Tiện dụng!

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

Tôi rất hạnh phúc Tôi thấy điều này, không thể tìm ra bất cứ nơi nào khác làm thế nào để làm điều này. : D – bio595

+1

Tôi nghĩ rằng bạn đang thiếu 'Marshal.Release (hierarchyPtr); Marshal.Release (selectionContainerPointer); 'ở cuối để tránh rò rỉ bộ nhớ. Nếu không thì tuyệt! – MickyD

+0

Điều này có thể hiển nhiên nhưng với tư cách là người dùng mới sử dụng IntPtr, bạn nên kiểm tra selectionContainerPointer == IntPtr.Zero trước khi gọi Marshal.Release trên nó để tránh một ngoại lệ con trỏ null. – webjprgm