2011-02-01 20 views
6

यदि मैं एक COM सर्वर के रूप में उपयोग करने योग्य .NET असेंबली बनाना चाहता हूं तो मुझे गुणों का एक सेट जोड़ना होगा और फिर इसे COM सर्वर के रूप में पंजीकृत करने के लिए regasm का उपयोग करना होगा।राजनीति ने मुझे मजबूत नाम से हस्ताक्षर करने के बारे में चेतावनी क्यों दी?

विधानसभा एक मजबूत नाम regasm जब /codebase कुंजी के साथ चलाने के साथ हस्ताक्षरित नहीं है एक RA0000 चेतावनी कह रही है कि विधानसभा एक ही कंप्यूटर पर अन्य विधानसभाओं के साथ हस्तक्षेप कर सकता है और मैं एक मजबूत नाम के साथ इस पर हस्ताक्षर करना चाहिए, लेकिन पता चलता पंजीकरण सफल होता है और यह भी ठीक काम करता है।

AFAIK मजबूत नाम तथाकथित डीएलएल नरक को रोकने के लिए हैं। लेकिन डीएलएल नरक को रोकने के लिए भी COM का मतलब था। यदि मैं COM के संपर्क में आने वाले किसी भी इंटरफेस को बदलता हूं तो मुझे या तो GUID बदलना होगा या कम से कम बाइनरी संगतता बनाए रखना चाहिए। तो एक मजबूत नाम से हस्ताक्षर करने में कुछ भी उपयोगी नहीं लगता है - कुछ भी मुझे COM इंटरफेस तोड़ने से रोकता है, फिर उसी कीपैयर से साइन इन करता है और पूर्ण-उड़ा डीएलएल नरक होता है।

COM-exposed .NET असेंबली के मामले में मजबूत नाम के साथ साइन इन करने का क्या उपयोग है?

उत्तर

7

यह एक बेवकूफ चेतावनी है। COM DLL नरक के दो पहलू हैं। वास्तव में बुरा एक सार्वजनिक इंटरफेस को संशोधित कर रहा है और नए GUID को असाइन नहीं कर रहा है। एक क्लाइंट ऐप जिसे पुन: संकलित नहीं किया गया था, दुर्घटनाग्रस्त हो जाता है और जला देता है जब यह एक पूरी तरह से गलत विधि या एक बुरा AccessViolationException के साथ बम कहते हैं जो कारण हो सकता है कि कोई कारण नहीं है।

दूसरा दूसरा सबकुछ सही कर रहा है (नए GUID को असाइन करना) लेकिन फिर मौजूदा संस्करण को नए संस्करण के साथ ओवरराइट करना। आप अभी भी उस पुराने क्लाइंट ऐप को क्रैश करेंगे लेकिन एक E_NOINTERFACE hresult के साथ अधिक हल्के ढंग से जो एक सुंदर विशिष्ट अपवाद उत्पन्न करता है जो आपको कारण का निदान करने में मदद करता है। हालांकि उपयोगकर्ता कोई खुश नहीं है।

परिदृश्य .NET में एक तैयार समाधान है कि, GAC पक्ष-साथ अलग संस्करण संख्या के साथ विधानसभाओं की तैनाती ताकि दोनों पुराने और नए संस्करण कर सकते हैं सह अस्तित्व और बासी क्लाइंट ऐप जारी है का समर्थन करता है पुराने संस्करण से खुश होने के लिए। जिसके लिए एक मजबूत नाम की आवश्यकता है। हां, जब आप/कोडबेस का उपयोग करते हैं तो यह चेतावनी निश्चित रूप से दबा दी जा सकती है क्योंकि इससे यह स्पष्ट हो जाता है कि आप जीएसी का उपयोग नहीं करेंगे। यद्यपि यह आपकी नाक को/कोडबेस का उपयोग करने में थोड़ा सा झटका नहीं देता है। साथ ही, परीक्षण के दौरान आप कभी भी अपने देव मशीन पर जीएसी का उपयोग नहीं करते हैं, लेकिन तैनाती करते समय निश्चित रूप से इसे ध्यान में रखना चाहिए।

1

मजबूत नामकरण मुख्य रूप से डीएएल को जीएसी में रखने के लिए उपयोग किया जाता है। तो आपके पास उसी कंप्यूटर पर उसी नाम (!) के साथ डीएल के कई संस्करण हो सकते हैं, जो नियमित COM-Dlls अक्सर समस्याओं का उत्पादन करते हैं। डीएलएस पर हस्ताक्षर नहीं करने से जीएसी की क्षमता को हटा दिया जाता है। इसके कारण आपके पास कोई तत्काल समस्या नहीं है लेकिन आप एक उपयोगी सुविधा का उपयोग नहीं करते हैं, इसलिए आपको चेतावनी मिलती है।

2

मेरे ज्ञान के लिए, COM डीएलएल नरक को रोकने के लिए नहीं था, यह हेड्स का गड्ढा था। शब्द "डीएलएल नरक" एक ही नामित विधियों वाले प्रत्येक पुस्तकालयों की समस्या से आता है। सिस्टम रजिस्ट्री में COM असेंबली का पंजीकरण रनटाइम पर रिज़ॉल्यूशन में मदद नहीं करता है।

एक COM सर्वर के रूप में कार्य करने के लिए एक असेंबली पर हस्ताक्षर करना सुनिश्चित करता है कि असेंबली एक ही कंप्यूटर पर अन्य COM-registered असेंबली के साथ टकरा नहीं है। हस्ताक्षर किए बिना, यदि दो कॉम-पंजीकृत असेंबली के समान नाम के तरीके थे, तो इससे समस्याएं पैदा हो सकती हैं।