2012-05-16 19 views
14

सी # में COM ऑब्जेक्ट के प्रतिबिंब के माध्यम से मैं सभी संपत्ति नामों को कैसे पढ़ सकता हूं? मुझे पता है कि अगर मुझे नाम पता है तो संपत्ति कैसे प्राप्त करें।COM ऑब्जेक्ट के प्रतिबिंब के माध्यम से संपत्ति के नाम प्राप्त करें

comObject.GetType().InvokeMember("PropertyName", System.Reflection.BindingFlags.GetProperty, null, comObject, null); 

लेकिन जब मैं सभी गुणों को डंप करना चाहता हूं तो क्या होगा?

PropertyInfo[] properties = t.GetProperties(); 

इस तरह कॉम-वस्तुओं के साथ काम नहीं किया। अगर मैं एक GetMembers करना() मैं इन सदस्यों को मिलती है:

Name: GetLifetimeService 
Name: InitializeLifetimeService 
Name: CreateObjRef 
Name: ToString 
Name: Equals 
Name: GetHashCode 
Name: GetType 

संबंध क्रिस

+2

यह स्पष्ट नहीं है कि तुम क्या कह रहे हैं, क्योंकि आप पहले से ही इस सवाल का जवाब दे रहे हैं प्रदान की है। 'GetProperties' एक प्रकार के सभी गुणों को वापस कर देगा। –

+0

ठीक है, 'PropertyInfo.Name'? –

+2

लेकिन COM-ऑब्जेक्ट का नहीं! –

उत्तर

12

आप __ComObject वर्ग, एक RCW के लिए अंतर्निहित नेट वर्ग के सदस्यों मिला है।

COM प्रतिबिंब के लिए बहुत कम समर्थन है, जब तक COM coclass IDispatch, ऑटोमेशन इंटरफ़ेस लागू करता है। असामान्य नहीं, यह इंटरफ़ेस है जो कॉल करने के लिए उपयोग की जाने वाली भाषाओं को स्क्रिप्टिंग करता है। IDispatch.GetIDsOfNames() हमेशा लागू किया जाता है, लेकिन आपको सदस्य के नाम को सामने जाना होगा। IDispatch.GetTypeInfo() कोक्लास के लिए प्रकार लाइब्रेरी तक पहुंच प्रदान करता है, लेकिन हमेशा लागू नहीं होता है। मेटाडेटा में टाइप लाइब्रेरी जानकारी का अनुवाद एक अपूर्ण कला है, मुख्य कारण यह है कि .NET चाहता है कि आप इसे Tlbimp.exe के साथ आगे करें। यदि आप रनटाइम दृष्टिकोण का पीछा करना चाहते हैं तो आपको शायद Tlbimp के प्रबंधित संस्करण के लिए स्रोत से लाभ होगा, available here

बिल्डिंग समय पर इसे आगे करना हमेशा सर्वोत्तम होता है, आप टाइप लाइब्रेरी (आमतौर पर निष्पादन योग्य फ़ाइल में एम्बेडेड) या Tlbimp.exe को चलाकर संदर्भ जोड़कर ऐसा करते हैं। अब आपको एक .NET इंटरऑप रैपर क्लास मिला है जिसमें अंतर्निहित COM कोक्लास और इंटरफेस के सभी सदस्य हैं। उस बिंदु पर आपको शायद प्रतिबिंब की आवश्यकता नहीं है :)

10

मैंने अभी Reflection with IDispatch-based COM objects कैसे करें के बारे में कोडप्रोजेक्ट आलेख प्रकाशित किया है। लेख एक छोटी सी # DispatchUtility सहायक वर्ग प्रदान करता है जो अन्य परियोजनाओं में शामिल करना आसान है। आंतरिक रूप से, यह IDISpatch के ITTpeInfo को एक समृद्ध .NET प्रकार उदाहरण में परिवर्तित करने के लिए IDISpatch और .NET के TypeToTypeInfoMarshaler की एक कस्टम घोषणा का उपयोग करता है।

अपने उदाहरण में, आप एक .NET प्रकार उदाहरण वापस पाने के लिए DispatchUtility.GetType(comObject, true) पर कॉल कर सकते हैं, जिसे आप GetProperties या GetMembers पर कॉल कर सकते हैं।

मैं भी StackOverflow पर DispatchUtility स्रोत कोड का एक संस्करण एक जवाब में How to enumerate members of COM object in C#?

+0

भयानक लेख के लिए धन्यवाद। मैंने इसका इस्तेमाल करने की कोशिश की लेकिन एक समस्या का सामना करना पड़ा। मुझे त्रुटि मिल रही है: "टाइप लाइब्रेरी को क्लियर असेंबली से निर्यात किया गया था और इसे फिर से आयात नहीं किया जा सकता" मैं ऑब्जेक्ट बनाने के लिए Activator.createInstance का उपयोग कर रहा हूं। जिस टूल के लिए मैं COM ऑब्जेक्ट बना रहा हूं वह है टिब्को स्पॉटफायर v6.5.2 क्या आप कृपया मदद कर सकते हैं। धन्यवाद – Prabhakar

+0

@ बिल मेनेस, क्या आपके सहायक वर्ग का उपयोग [ऑब्जेक्ट का उदाहरण बनाने के लिए पावरशेल] में किया जा सकता है (http://stackoverflow.com/questions/41945859/use-powershell-to-create-instance-of-com-object)? – craig

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

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