2013-01-09 27 views
28

मैं ऐसे उत्पाद पर काम कर रहा हूं जो COM इंटरऑप के माध्यम से कुछ .NET API को उजागर करता है। निर्माण के एक हिस्से के रूप में हम सभी ऐसी असेंबली के लिए * .tlb फ़ाइलें जेनरेट करते हैं और उन्हें एक अलग एसडीके पैकेज के हिस्से के रूप में वितरित करते हैं। हमारे ग्राहक हमारे उत्पाद के शीर्ष पर एसडीके स्थापित कर सकते हैं और हमारे COM API का उपयोग करने वाले एप्लिकेशन बना सकते हैं।* .tlb फ़ाइलों को कभी भी रनटाइम पर उपयोग किया जाता है?

क्या हमें उत्पाद के साथ उन * .tlb फ़ाइलों को शिप और पंजीकृत करने की आवश्यकता है? क्या ऐसी स्थिति है जब * .tlb रनटाइम पर आवश्यक है, जब उनके खिलाफ कोडित तीसरे पक्ष के पुस्तकालयों को निष्पादित किया जाता है?

कृपया बताएं कि यह कैसे काम करता है, अगर आप हाँ का जवाब देते हैं। मैंने इंटरनेट पर कई टिप्पणियां देखीं जो कहती हैं कि मुझे उन्हें वितरित करना और पंजीकरण करना है, लेकिन मुझे वह नहीं मिला जो स्पष्ट रूप से समझाता है कि इसे क्यों किया जाना चाहिए। इससे मुझे संदेह हुआ कि यह सच है।

उत्तर

28

हां, यह संभव है। विशेष रूप से .NET के मामले में, आपको टाइप लाइब्रेरी को पंजीकृत नहीं करना चाहिए क्योंकि आप भविष्यवाणी नहीं कर सकते कि क्लाइंट कोड आपके सर्वर का उपयोग कैसे करेगा।

वे विशेष रूप से सामान्य नहीं हैं लेकिन वहाँ दो मामलों हैं:

  • ग्राहक कोड आपके [ComVisible] प्रणाली को बुलाती है और कॉल एक अपार्टमेंट सीमा को पार करते हैं। अपार्टमेंट एक COM अवधारणा है जो थोड़ा अस्पष्ट है, आपको एसटीए और एमटीए धागे के बीच अंतर को समझना होगा। इसे सरल रखना: एक अपार्टमेंट सीमा आमतौर पर पार हो जाती है जब कॉल किसी अन्य थ्रेड से, किसी अन्य प्रक्रिया से या किसी अन्य मशीन से बनाई जाती है। COM को आईपीसी पैकेट में कॉल के तर्कों को क्रमबद्ध करने के तरीके को जानने में सहायता की आवश्यकता है और इसके लिए तर्कों के प्रकार को जानने की आवश्यकता है। COM में प्रतिबिंब की कोई अवधारणा नहीं है इसलिए इसे आसानी से स्वचालित रूप से नहीं किया जा सकता है। एक अलग डीएलएल की आवश्यकता होती है जो प्रॉक्सी और स्टब को लागू करता है, लगभग हमेशा आईडीएल फ़ाइल से उत्पन्न होता है। .NET में आना मुश्किल है, आप लगभग हमेशा विंडोज़ में बने मानक मार्शलर का उपयोग करके सुविधाजनक दूसरे तरीके का उपयोग करते हैं। जो तर्क प्रकार हैं, यह जानने के लिए एक प्रकार की लाइब्रेरी का उपयोग करता है। Regasm.exe/tlb विकल्प यह सुनिश्चित करता है कि इंटरफ़ेस प्रॉक्सी/स्टब और प्रकार लाइब्रेरी पंजीकृत है, इसलिए मानक मार्शलर लाइब्रेरी पा सकता है।

  • जब आप अपने सार्वजनिक इंटरफ़ेस में एक संरचना का पर्दाफाश करते हैं। स्ट्रोक इंटरऑप परिदृश्यों में बहुत परेशान हैं, उनके पास एक लेआउट है जो संकलक सेटिंग्स पर अत्यधिक निर्भर है। समकक्ष .NET प्रॉपर्टी StructLayout.Pack है। .NET में 8 पर फिक्स्ड लेकिन क्लाइंट कोड उसे नहीं जानता है। एक संरचना तक पहुंचने के लिए, क्लाइंट कोड को IRecordInfo का उपयोग करना चाहिए। जो यह पता लगाने देता है कि संरचना के हर क्षेत्र स्मृति में स्थित है। एक प्रकार पुस्तकालय जानकारी प्रदान करता है कि IRecordInfo की आवश्यकता है। .NET में पूरी तरह से और बहुत आसानी से किए गए structs से बचने के लिए निश्चित रूप से सबसे अच्छा है।

+0

धन्यवाद जो मैं ढूंढ रहा था। – Dennis

+1

माइक्रोसॉफ्ट दस्तावेज इसकी पुष्टि करता है: http://msdn.microsoft.com/en-us/library/eaw10et3.aspx#marshaling_and_com_apartments "क्रॉस-अपार्टमेंट मार्शलिंग के ओवरहेड को स्वीकार करें, जो केवल कई कॉल होने पर ध्यान देने योग्य है सीमा पार आपको सफलतापूर्वक अपार्टमेंट सीमा पार करने के लिए कॉल के लिए COM घटक की टाइप लाइब्रेरी पंजीकृत करनी होगी। " – Dennis

+1

http://msdn.microsoft.com/en-us/library/windows/desktop/ms692621(v=vs.85)।एएसपीएक्स "कस्टम इंटरफेस के लिए प्रॉक्सी और स्टब्स उत्पन्न करने के लिए एमआईडीएल का उपयोग करने का एक विकल्प, इसके बजाय एक प्रकार की लाइब्रेरी उत्पन्न की जा सकती है और सिस्टम प्रदान किया जा सकता है, टाइप-लाइब्रेरी-संचालित मार्शलिंग इंजन इंटरफ़ेस को मार्शल करेगा।" – Dennis

0

मुझे .NET dll पंजीकृत करते समय एक समस्या का सामना करना पड़ रहा था जो COM घटक में .tlb संदर्भों के रूप में उपयोग कर रहा था।

तो आपको .NET dll (.tlb प्रोजेक्ट) को पंजीकृत करने की आवश्यकता नहीं है।

मुझे आशा है कि यह काम करेगा।