2013-02-10 14 views
9

इस related question में, मैंने ध्यान दिया कि विजुअल स्टूडियो का डीबगर System.__ComObject संदर्भों के गुणों को गिनने में सक्षम है, जो "एक छिपी हुई प्रकार है जब रैपर प्रकार अस्पष्ट है" - उदाहरण के लिए, जब आप इसे प्राप्त करते हैं तो ऑब्जेक्ट का प्रकार मिलता है एक और COM ऑब्जेक्ट से और यह अपने आप का दृष्टांत नहीं है: इसके अतिरिक्तविजुअल स्टूडियो की डीबगर/इंटरैक्टिव विंडो .NET में COM ऑब्जेक्ट्स के गुणों को कैसे डंप करती है?

COM Object Debug View

, अगर आप बस तत्काल विंडो में कोई COM ऑब्जेक्ट के पहचानकर्ता लिखते हैं, उसके गुण और मूल्यों इसी तरह फेंक दिया जाता है:

COM Object Immediate Window

ध्यान दें कि यह वीएस -2010 के "Dynamic View" से अलग है, जो मुझे लगता है कि IDispatch और पीआईए और .NET प्रतिबिंब के उपयोग के बिना COM ऑब्जेक्ट्स के गुणों का आकलन करने के लिए COM प्रतिबिंब का उपयोग करता है। वस्तुओं के साथ मैं काम कर रहा हूँ कर नहीं लागू IDispatch (और न ही वे उस बात के लिए IProvideClassInfo लागू करते हैं), और जैसे, "गतिशील दृश्य" नहीं उनके बारे में कोई जानकारी प्राप्त करने में सक्षम है:

Dynamic View

दिलचस्प बात यह है कि SharpDevelop का डीबगर System.__Comobject एस (उदाहरण के लिए point.Envelope) के सदस्यों को सूचीबद्ध करने में सक्षम नहीं है, केवल दृढ़ता से टाइप किए गए आरसीडब्ल्यू (उदाहरण के लिए point)।

SharpDevelop debugger

तो कैसे दृश्य स्टूडियो यह करने में सक्षम है?

मुझे इस मामले में विश्वास है, ऐसा इसलिए है क्योंकि प्राथमिक इंटरऑप असेंबली इन वस्तुओं द्वारा समर्थित इंटरफेस के लिए परिभाषाओं के साथ मौजूद हैं, और विजुअल स्टूडियो संभावित इंटरफेस और गुणों को गिनने के लिए प्रतिबिंब का उपयोग कर रहा है। क्या यह सही है? और यदि हां, तो यह कैसे काम करता है?

शुरुआत के लिए, यह पीआईए तक कैसे पहुंचता है? क्या यह केवल वर्तमान में लोड किए गए पीआईए को देखता है या क्या यह गतिशील रूप से उन्हें लोड करता है (और यदि ऐसा है, तो कैसे)? यह कैसे निर्धारित करता है कि किस इंटरफ़ेस, जिसमें से कई गुण हो सकते हैं, के गुणों का आकलन करने के लिए? यह केवल एक का उपयोग करता प्रतीत होता है, और जरूरी नहीं कि पहले। एपीआई के documentation से मैं (आर्कऑब्जेक्ट्स) के साथ काम कर रहा हूं, इन ऑब्जेक्ट्स के लिए डिफ़ॉल्ट इंटरफ़ेस IUnknown है, इसलिए यह केवल डिफ़ॉल्ट इंटरफ़ेस का उपयोग नहीं कर रहा है।

स्क्रीनशॉट में उदाहरण में, यह इंटरफ़ेस IEnvelope इंटरफ़ेस का सदस्य है, जो IGeometry इंटरफ़ेस से प्राप्त होता है। VS2010 कैसे IGeometry के सदस्यों की गणना करने के लिए नहीं जानता है, जो मेरे परीक्षण में पहले दिखाई देता है यदि आप केवल पीआईए में सभी इंटरफ़ेस प्रकारों का आकलन करते हैं? कुछ बहुत चालाक चल रहा है या शायद मुझे कुछ याद आ रही है?

कारण मैं पूछ रहा हूं कि LINQPadappears willing के डेवलपर को समान कार्यक्षमता लागू करने के लिए यदि वह जानता था कि वीएस कैसे करता है। तो यहां एक अच्छा जवाब उस लोकप्रिय उपकरण को बेहतर बनाने में मदद करने के लिए एक लंबा रास्ता तय कर सकता है।

+0

चूंकि प्वाइंट क्लास की लिफाफा संपत्ति के प्रकार को पीआईए में आईनेफाफे के रूप में परिभाषित किया गया है, वीएस इसे डंप करने में सक्षम है, विशेष तंत्र की आवश्यकता नहीं है। –

+0

हम्म यह वास्तव में इतना आसान है? क्या यह जानकारी केवल डीबग समय पर उपलब्ध है? (कैसे) एक ही जानकारी रनटाइम पर प्राप्त की जा सकती है? और क्यों SharpDevelop के डीबगर एक ही नहीं करते हैं (शायद वे सिर्फ परवाह नहीं करते हैं)। – blah238

+0

हां यह बहुत आसान है। यह अधिक जटिल है जब आपके पास केवल System._ComObject है, लेकिन जब आप उन्हें ComImport .NET इंटरफेस के रूप में डाल सकते हैं, तो आपके पास इन इंटरफेस लेआउट तक पहुंच है। यह इंटेलिजेंस समेत हर समय उपलब्ध है। मैं तीव्र विकास के बारे में नहीं जानता। –

उत्तर

2

यह है कि यह कैसे करना है:

  • प्राप्त COM ऑब्जेक्ट के IDispatch
  • (वैकल्पिक संभव पथ IDispatchEx है) पुस्तकालय टाइप करने के लिए एक संदर्भ प्राप्त - IDispatch::GetTypeInfo
  • लोड प्रकार लायब्रेरी और गणना गुण
  • खोज गुणों के लिए मूल्यों के लिए वास्तविक वास्तविक वस्तु

अतिरिक्त वृद्धि ओपियंस लागू होते हैं: क्वेरी IPersist* इंटरफ़ेस का परिवार या IProvideClassInfo वैकल्पिक रूप से ऑब्जेक्ट के लिए टाइपेलब्रिरी का संदर्भ प्राप्त करने और गुणों की खोज करने के लिए।

+0

जैसा कि मैंने लिखा था, इनमें से कोई भी इंटरफेस इन वस्तुओं द्वारा लागू नहीं किया गया है। असल में उनमें से कुछ 'आईपर्सिस्ट' को लागू करते हैं लेकिन सभी नहीं। मुझे यह देखने के लिए जांच करनी होगी कि कौन से लोग करते हैं और इसकी तुलना नहीं करते हैं और तुलना करते हैं कि VS2010 उनके बारे में क्या पता लगा सकता है। – blah238

+0

'आईडीस्पैचएक्स', 'आईपीरोवाइड क्लासइन्फो 2' (ठीक है, यह एक सामान्य है, न कि 'आईप्रोवाइड क्लासइन्फो') - कुछ –

+0

नहीं होना चाहिए, न तो उनमें से कोई भी। – blah238

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