2009-11-03 15 views
46

मुझे कुछ स्पष्टीकरण की आवश्यकता है। मेरे पास एक रिपोर्टराइटर डीएल है जो क्रिस्टल रिपोर्ट का उपयोग करता है। यह वीबी 6 में लिखा गया है। मुझे अपने एएसपीनेट प्रोजेक्ट में यह डीएल जोड़ना है, जहां यह एक इंटरऑप डीएल बनाता है।इंटरऑप डीएलएल क्या है?

मेरी समझ के लिए, इंटरऑप डीएल एक मध्यस्थ के रूप में है ताकि मेरा .NET कोड Reportwriter dll से बात कर सके।

तो क्या मैं इंटरऑप डीएल पंजीकृत करता हूं या क्या मैं मूल डीएल पंजीकृत करता हूं?

+0

+1 मुझे लगता है कि यह एक अच्छा सवाल था, भले ही कोई और आपके लिए मतदान न करे। :) – Dusty

उत्तर

85

जब आप वीबी 6 में कोड लिखेंगे, संकलित परिणाम एक COM घटक होगा। COM घटक इंटरफेस, कोक्लास, structs और enums प्रदान करते हैं, जिन्हें आमतौर पर COM प्रकार लाइब्रेरी का उपयोग करके वर्णित किया जाता है। हालांकि, .NET में उस COM घटक का उपभोग करने के लिए, आपको उस प्रारूप में टाइप विवरण की आवश्यकता है जो .NET समझता है - यानी .NET असेंबली (क्योंकि यह सीधे प्रकार के पुस्तकालयों के साथ काम नहीं कर सकता)। इसलिए एक इंटरऑप असेंबली सिर्फ एक "रूपांतरित" COM प्रकार लाइब्रेरी है, इस अर्थ में कि इसमें इंटरफ़ेस, structs इत्यादि का विवरण शामिल है जो एक प्रकार की लाइब्रेरी में समान चीजों से मेल खाते हैं।

(ऊपर कुछ हद तक सरल है, के रूप में इंटरॉप विधानसभा नहीं है एक प्रकार लायब्रेरी से उत्पादन किया जा के लिए करता है - आप हाथ से कोड कर सकते हैं एक अगर आप चाहते हैं, उदाहरण के लिए।)

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

अब आपके प्रश्न के अनुसार। आपको अपने COM DLL (आपके VB6 का आउटपुट) प्रोजेक्ट पंजीकृत करना होगा - उदाहरण के लिए, regsvr32.exe का उपयोग करना। आपको वास्तव में एक इंटरऑप असेंबली पंजीकृत नहीं करना चाहिए, क्योंकि यह COM घटक नहीं है - यह सिर्फ एक सादा .NET असेंबली है, इसलिए आप इसे अपने .exe/.dll के साथ उसी फ़ोल्डर में डाल सकते हैं। , या सामान्य रूप से इसे जीएसी में डाल दें।

+0

तो इंटरपॉप कैसे पता चलता है कि रिपोर्ट डीएलएल मौजूद है, जब मैं अपने .NET कोड से अपने तरीकों पर कॉल करता हूं? क्या इंटरऑप रजिस्ट्री में एक कुंजी का अनुवाद करता है? –

+1

जब आप अपना COM घटक पंजीकृत करते हैं, तो इसका स्थान रजिस्ट्री में दर्ज किया जाता है, और घटक के GUID ज्ञात होने पर वहां से पुनर्प्राप्त किया जा सकता है। इंटरऑप असेंबली टाइपिलिब के लिए GUID जानता है, जिससे इसे उत्पन्न किया गया था, और उस टाइपेलिब के भीतर सभी प्रकार के लिए GUID - वे .NET विशेषताओं के रूप में संग्रहीत हैं। रनटाइम रजिस्ट्री के माध्यम से COM घटक को हल करने के लिए इस जानकारी का उपयोग करेगा। –

2

आप सही हैं। इंटरऑप डीएलएल वीबी 6 घटक को कॉल लपेटता है और उन्हें पारदर्शी बनाता है।

मशीन पर डीएलएल पंजीकृत करते समय आप एप्लिकेशन को निष्पादित करेंगे, आपको अभी भी वीबी 6 डीएलएल पंजीकृत करना होगा। इंटरऑप डीएलएल आपके ऐप के बिन फ़ोल्डर और मार्शल को कॉल करेगा।

2

आपको अपना वीबी 6 डीएल पंजीकृत करना चाहिए और इसे अपने .NET प्रोजेक्ट में संदर्भित करना चाहिए; वह संदर्भ आपके Interop.dll

7

पावेल से अच्छा जवाब। इसके अलावा, .NET Framework संस्करण 4 के साथ शुरुआत करने के लिए आपको अपने एप्लिकेशन के साथ इंटरऑप असेंबली को तैनात करने की आवश्यकता नहीं है - http://msdn.microsoft.com/en-us/library/tc0204w0.aspx

+0

एंबेन्टर इंटरप्ट टाइप आप रोजाना कुछ नया सीखते हैं। – granadaCoder

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