2012-06-15 13 views
5

से चयनित प्रोजेक्ट मैं विजुअल स्टूडियो 2010 (बनाम) के लिए एक अनुकूलन पैकेज लिख रहा हूं।समाधान एक्सप्लोरर

मुझे क्या करना है समाधान समाधान एक्सप्लोरर में प्रोजेक्ट नोड्स में संदर्भ मेनू बटन जोड़ना है।

प्रोजेक्ट नोड्स पर राइट-क्लिक करते समय मैं संदर्भ मेनू प्रकट करने में कामयाब रहा हूं, लेकिन मेरी अगली चुनौती प्रोजेक्ट ऑब्जेक्ट का संदर्भ प्राप्त करना है जिसे क्लिक किया गया है। वर्तमान में मैं नीचे दिए गए कोड का उपयोग कर आईडीई में सक्रिय दस्तावेज़ के माध्यम से प्रोजेक्ट प्राप्त करने में सक्षम हूं।

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

तो मेरा सवाल है: समाधान समाधान में चयनित परियोजना के लिए मुझे एक समान संदर्भ कैसे मिलता है?

उत्तर

11

मैंने इसे समझ लिया। जानकारी के साथ ही साझा कर सकते हैं।

SVsShellMonitorSelection सेवा का उपयोग करके मैं चयनित पदानुक्रम का संदर्भ IVsHierarchy के रूप में संदर्भित कर सकता हूं, जो बदले में मुझे चयनित ऑब्जेक्ट का संदर्भ प्राप्त करने की अनुमति देता है। इसके बाद समाधान एक्सप्लोरर में चुने गए विकल्पों के आधार पर Project, ProjectItem, आदि जैसे वर्गों में डाला जा सकता है। हैंडी!

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

मैं मैं इस पाया बहुत खुश हूँ, कहीं और ऐसा करने के तरीके बाहर नहीं मिल सका। : डी – bio595

+1

मुझे लगता है कि आप 'मार्शल' रिलीज (पदानुक्रम पीआरटी) खो रहे हैं; मार्शल। रिलीज (चयनकंटनर पॉइंटर); अंत में एक स्मृति रिसाव से बचने के लिए। अन्यथा महान! – MickyD

+0

यह स्पष्ट हो सकता है लेकिन IntPtr के नौसिखिया उपयोगकर्ता के रूप में यह इंगित करने लायक है कि आप मार्शल को कॉल करने से पहले चयनकर्ता नियंत्रक == IntPtr.Zero की जांच कर सकते हैं। शून्य पॉइंट अपवाद से बचने के लिए इसे छोड़ दें। – webjprgm

संबंधित मुद्दे