.net - "COM इंटरॉप के लिए पंजीकरण करें" बनाम "असेंबली कॉम को दृश्यमान बनाएं"




visual-studio com-interop (2)

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

असेंबली बनाए जाने के बाद, इसे पंजीकृत करने की आवश्यकता है ताकि एक COM क्लाइंट इसे वापस पा सके। वह केवल उस ऑब्जेक्ट को पहचानने के लिए एक नंबर का उपयोग करता है जिसे वह बनाना चाहता है, GUID, यह जानने के लिए एक अतिरिक्त लुक आवश्यक है कि DLL इसे क्या लागू करता है। रजिस्ट्री में HKLM\Software\Classes\CLSID\{guid} भाग में लेखन कुंजियाँ शामिल हैं। आप इसे Regasm.exe /codebase /tlb चलाकर स्वयं कर सकते हैं या आप इसे असेंबली बनाने के बाद स्वचालित रूप से करने के लिए इसे बिल्ड सिस्टम तक छोड़ सकते हैं।

जो "COM इंटरॉप के लिए रजिस्टर" करता है। यह वांछनीय है क्योंकि यह सुनिश्चित करता है कि डीएलएल की पुरानी कॉपी ओवरराइट होने से पहले स्वचालित रूप से अपंजीकृत हो जाती है, जो रजिस्ट्री प्रदूषण को रोकता है। वी.एस. को उन रजिस्ट्री कुंजियों तक पहुँच लिखने के लिए उन्नत बनाने की आवश्यकता है, जो इसे वैकल्पिक बनाने का एक कारण है। या आप बस इसे पंजीकृत नहीं करना चाहते हैं, बिल्ड सर्वर पर आम है। मैं इस बात पर टिप्पणी नहीं कर सकता कि आप कभी-कभी अधिक निदान के बिना .tlb क्यों नहीं प्राप्त करेंगे।

इन दो विकल्पों में वास्तविक अंतर क्या है? मुझे क्या पता है:

COM इंटरॉप के लिए रजिस्टर करें
यह विकल्प असेंबली पर regasm निष्पादित करता है और असेंबली को COM कंपोनेंट (या शायद नहीं) के रूप में रजिस्ट्री में सभी COM जैसे रजिस्ट्री प्रविष्टियों को पंजीकृत करता है। क्या यह चरण एक TLB फ़ाइल बनाता है? और क्या किया जाता है?

कभी-कभी मैं देखता हूं कि जब मैं प्रोजेक्ट संकलित करता हूं तो एक tlb उत्पन्न होता है, लेकिन कभी-कभी ऐसा नहीं होता, ऐसा क्यों है?

असेंबली COM को दृश्यमान बनाएं
एक विधानसभा पर इसका क्या प्रभाव पड़ता है? यदि मेरे पास इस विधानसभा के अंदर निम्न प्रकार है, तो क्या मुझे अभी भी "असेंबली COM विज़िबल" निर्दिष्ट करने की आवश्यकता है, भले ही मेरे प्रकार को कॉमविजबल के रूप में चिह्नित किया गया हो?

[GuidAttribute("02810C22-3FF2-4fc2-A7FD-5E103446DEB0"), ComVisible(true)]
public interface IMyInterface
{
}

चयनित उत्तर में की गई टिप्पणियों के अलावा, RegAsm उपयोगिता के / U विकल्प का उपयोग करके, विंडोज की रजिस्ट्री से संबंधित रिकॉर्ड को हटाने के बिना पहले से रिकॉर्ड किए गए प्रकार (या एप्लिकेशन या सेवा को बंद करने या लाइब्रेरी का उपयोग करने वाले) को बदलकर टाइप नहीं किया जाता है, तो tlb फाइल नहीं बनाई जाती है:

Regasm.exe yourlibrary.dll /codebase /tlb /u

इसके अलावा, यह उल्लेख करना महत्वपूर्ण है कि COM के रूप में पुस्तकालय की खपत के लिए रजिस्ट्री, केवल विकास मशीन में काम करेगी यदि यह COM इंटरॉप और मेक असेंबली COM-Visible के लिए विकल्प रजिस्टर का उपयोग करके संकलित की जाती है। यह संकेतित कमांड लाइन का उपयोग करके प्रत्येक गंतव्य कंप्यूटर में मैन्युअल रूप से पंजीकृत करने के लिए आवश्यक है, या लाइब्रेरी स्थापित होने पर निष्पादित होने वाली स्क्रिप्ट का निर्माण करना।

इस टिप्पणी को उत्तर के रूप में रखने के लिए मेरी क्षमा याचना, लेकिन मैं टिप्पणियों को एक पोस्ट में नहीं रख सकता क्योंकि प्रतिष्ठा के 50 बिंदुओं का अनुरोध कर रहा हूं।





compiler-options