2010-03-04 13 views
7

आज एक दिलचस्प सवाल उठ गया। मान लें कि मेरे पास एक .NET ऑब्जेक्ट है जो एक निश्चित इंटरफ़ेस IMYInterface लागू करता है और यह भी COM Visible है।क्या मैं एक .NET ऑब्जेक्ट या COM ऑब्जेक्ट को कॉल कर रहा हूं?

अब, मैं अपने ProgID से प्रकार लोड और एक जोरदार टाइप इंटरफ़ेस करने के लिए डाली है, तो जैसे: यदि मैं ऊपर कोड निष्पादित

IMyInterface objEarlyBound = null; 
Type t = Type.GetTypeFromProgID("My.ProgId"); 
objLateBound = Activator.CreateInstance(t); 

objEarlyBound= (IMyInterface)objLateBound; 

objEarlyBound.Method(); 

, जब objEarlyBound.Method() निष्पादित करता है, मैं बोल रहा हूँ एक COM ऑब्जेक्ट में या सीधे .NET ऑब्जेक्ट में? मैं इसे कैसे एक या दूसरे तरीके से साबित कर सकता हूं?

उत्तर

2

आप किसी भी तरह से साबित नहीं कर सकते हैं - यह एक आंतरिक कार्यान्वयन विकल्प है जिसे जानबूझकर आपसे छुपाया गया है।

objEarlyBound और objLateBound समान पहचान रखने की आवश्यकता है, जो कि == पर वापस आ जाएगा। इसलिए उनमें से प्रत्येक से आप हमेशा अन्य किसी भी इंटरफेस के लिए अन्य प्राप्त कर सकते हैं, और यदि आप इनमें से किसी को object पर असाइन करते हैं। लेकिन यह कुछ भी साबित नहीं करता है।

आप सीधे वर्ग कि My.ProgId रूप कॉम के माध्यम से सामने आ रहा है जिसमें विधानसभा संदर्भित करते हैं, तो आप कह सकते हैं:

IMyInterface objEarlyBound = new MyClassExposedThroughCOM(); 

इस बिंदु CLR के COM समर्थन बिल्कुल आवश्यक नहीं किया गया है पर। लेकिन फिर आप उस ऑब्जेक्ट को कुछ बाहरी COM लाइब्रेरी में पास कर सकते हैं, और उस समय सीएलआर ऑब्जेक्ट के साथ संबद्ध करने के लिए एक सीसीडब्ल्यू बनाएगा। और एक बार ऐसा करने के बाद, यह किसी भी दिए गए सीएलआर ऑब्जेक्ट के लिए हमेशा उसी सीसीडब्ल्यू पर वापस जा सकता है।

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

मैंने सीएलआर प्रश्नों के बारे में देखने के लिए हाथ से लागू सी ++ COM ऑब्जेक्ट के क्वेरी इंटेरफेस फ़ंक्शन में ब्रेकपॉइंट डालने का प्रयास किया है। असल में यह कई चीजों की कोशिश करता है, जिनमें से कुछ मैं तुरंत पहचान नहीं पाया, इसलिए यह एक साथी सीएलआर ऑब्जेक्ट के लिए "स्नीफिंग" हो सकता है। एक पागल COM सैंडविच स्थिति से बचने के लिए, ऐसा करने के लिए यह समझ में आता है, जिसमें एक सीएलआर संदर्भ आरसीडब्ल्यू को इंगित करता है, जो एक सीसीडब्ल्यू को इंगित करता है, जो सीएलआर ऑब्जेक्ट को इंगित करता है। सीएलआर संदर्भ को सीधे सीएलआर ऑब्जेक्ट पर इंगित करके इसे स्पष्ट रूप से सरल बनाया जा सकता है।

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

वैसे, इस चर्चा में से सभी मानते हैं कि COM ऑब्जेक्ट प्रक्रिया में है। यदि यह प्रक्रिया से बाहर है तो स्थिति पूरी तरह से अलग है; प्रत्येक प्रक्रिया का अपना सीएलआर उदाहरण होता है और साथ ही इंटरप्रोसेस मार्शलिंग के COM कार्यान्वयन का भी उपयोग कर सकता है।

+0

यह दिलचस्प और सहायक है, धन्यवाद। क्या मैं इसे अपने मुख्य विज्ञापन पर खड़ा कर सकता हूं, अगर मैं उपरोक्त मेरे उदाहरण से objLateBound लेता हूं, और objLateBound.InvokeMember ("विधि", ...) का उपयोग करके इसमें कॉल करता हूं तो इससे चीजों को कैसे प्रभावित किया जाता है? क्या वह हमेशा सीसीडब्ल्यू के माध्यम से कॉल करेगा, या फिर भी आपको लगता है कि सीएलआर .NET कक्षा को छीनने और सीधे इसका उपयोग करने के लिए पर्याप्त स्मार्ट हो सकता है? –

3

विशेष प्रकार की प्रणाली के आरसीडब्ल्यू (जो मुझे पता है) होना चाहिए .__ कॉमऑब्जेक्ट, हालांकि शायद आप जो करना चाहते हैं वह Marshal.IsComObject पर कॉल करें जो आपको बताएगा कि ऑब्जेक्ट रनटाइम रैपर है या नहीं।एक त्वरित परीक्षण में उस मार्ग के माध्यम से एक COM निर्मित ऑब्जेक्ट सीधे प्रबंधित ऑब्जेक्ट के रूप में समाप्त होता है और COM wrapper को खो देता है।

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