2009-08-14 11 views
10

मेरे पास एक प्रबंधित असेंबली है जिसे COM इंटरऑप के माध्यम से बुलाया जाता है। एक वीबीस्क्रिप्ट क्लाइंट की तरह, एक पर्ल क्लाइंट, और इसी तरह।क्या COM इंटरऑप कॉलर्स को सी # एनम का खुलासा करना संभव है, और यदि हां, तो कैसे?

कक्षाएं

[ClassInterface(ClassInterfaceType.AutoDual)] 
[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")] 
[ComVisible(true)] 

फिर से सजाया जाता है निश्चित रूप से मैं regasm बात करते हैं, और सभी तरीकों काफ़ी होंगे।

लेकिन असेंबली में भी enum प्रकार हैं। मैं enum मूल्यों के लिए प्रतीकात्मक नाम COM अनुप्रयोगों का उपयोग करना चाहता हूं।

मैं COM इंटरॉप के माध्यम से enums का पर्दाफाश कैसे करूं? क्या मुझे इन विशेषताओं को जोड़ने की ज़रूरत है?

[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")] 
[ComVisible(true)] 

और फिर, मैं उन प्रतीकात्मक नामों को वीबीस्क्रिप्ट में कैसे संदर्भित करूं? मुझे ओलेव्यू में enum प्रकार नहीं दिख रहे हैं। (क्या मुझे चाहिए?) मैं ओलेव्यू में अन्य सभी प्रकार देखता हूं।

उत्तर

3

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

मुझे प्रश्न के COM इंटरऑप भाग के बारे में अनिश्चितता है, लेकिन अगर ओमव्यू में enums दिखाया गया है, तो भी आप उन्हें सीधे उपयोग करने में सक्षम नहीं होंगे।

हालांकि, यदि आप टाइपेलिब में enums प्रकाशित करने में सक्षम हैं, तो मैंने पहले एक टूल लिखा था जो एक स्क्रिप्ट फ़ाइल (vbs या js) उत्पन्न कर सकता है जिसमें एक टाइपेलिब से सभी enums को स्थिरांक के रूप में उत्पन्न किया जा सकता है।

यहाँ देखें: http://www.kontrollbehov.com/tools/tlb2const/

+0

अच्छा जवाब। वह उपकरण बहुत उपयोगी लगता है। – Cheeso

+0

दुर्भाग्यवश मेरे पास पर्ल के लिए निरंतर जनरेटर नहीं है ... शायद यह फिर से विकास करने का समय है :-) –

9

मेरे (अब तक केवल) नेट विधानसभा कि मैं COM-दृश्यमान बनाया भी एक enum प्रकार है, जो दिखाया OleView में ठीक था। मेरी पूरी लाइब्रेरी COM-visible थी इसलिए

[ComVisible(true)] 

आवश्यक नहीं था। क्या आपका enum प्रकार सार्वजनिक है? प्रकार लायब्रेरी में

typedef [...] 
enum { 
    DataType_INT32 = 0, 
    DataType_FLOAT64 = 1, 
    DataType_INT8 = 2 
} DataType; 

:

public enum DataType 
{ 
    INT32, 
    FLOAT64, 
    INT8 
} 

में बदल गया:

एक बात कि क्या हुआ गया है कि विभिन्न enumerations 'के साथ enum प्रकार name'_' पहले से जुड़ा हुआ 'था।

+0

प्रोजेक्ट को कॉमविज़िबल (सत्य) के रूप में सेट किया गया था, लेकिन मेरे सभी enums ठीक काम कर रहे थे, लेकिन मैं कैसे किया था एक वीएस 6 सी ++ परियोजना में एएसएम का उपयोग करने के लिए टीएलबी बहुत बड़ा है !! मैंने पूरी परियोजना को झूठी के रूप में सेट किया और कक्षाओं और enums जो मैं चाहता था उजागर किया। कक्षाएं ठीक हैं, enums नहीं हैं !!? वे regsitry (सीएलएसआईडी) में उम्मीद के रूप में हैं, लेकिन बस सुलभ नहीं हैं। यह जानने में बहुत दिलचस्पी होगी कि क्यों .. –

+1

उपरोक्त क्योंकि मुझे कोई स्पष्ट स्पष्टीकरण नहीं मिला कि COM ने आपके enum मानों को नामांकित करने के लिए जादुई रूप से enum प्रकार के नाम के साथ उन्हें संदर्भित किया है। –

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