क्या दो DLL संघर्ष के लिए संभव है, निर्माण के लिए समाधान को रोकना


9

हालांकि मेरे पास एक विशिष्ट मामला है, लेकिन मैं सामान्य स्थिति के बारे में सोच रहा था।

क्या दो DLL, जब विज़ुअल C # प्रोजेक्ट के संदर्भ के रूप में जोड़े जाते हैं, तो निर्माण को रोकने के लिए एक दूसरे से टकरा सकते हैं? यदि यह मामला है, तो इसे कम करने के संभावित तरीके क्या हैं।

जवाबों:


13

यह बहुत संभव है।

यदि आपने विभिन्न विधानसभाओं पर एक समान नाम स्थान और प्रकार नाम परिभाषित किया है (या आपकी परियोजना और जोड़ा विधानसभा में), तो आपको किसी भी कोड के साथ एक संघर्ष मिलेगा जो इनमें से किसी एक या अन्य प्रकार का उपयोग करने की कोशिश करता है।

यदि आप सुनिश्चित करते हैं कि आपके पास अद्वितीय नामस्थान हैं, तो अपने संदर्भों के अनुसार आपको यह समस्या नहीं होगी।

एक अन्य संभावना पर निर्भरता के विभिन्न संस्करणों के साथ क्या करना है - यदि आपकी परियोजना (उदाहरण के लिए) 1.2 संस्करण में एक लॉगिंग लाइब्रेरी का उपयोग करती है, लेकिन जोड़े गए विधानसभा में एक ही विधानसभा पर निर्भरता है लेकिन एक अलग संस्करण (1.3 का कहना है) और या तो आपकी परियोजना या जोड़े गए असेंबली को एक विशिष्ट संस्करण का उपयोग करने के लिए कॉन्फ़िगर / निर्मित किया गया है, आपको एक संघर्ष मिलेगा और निर्माण विफल हो जाएगा।

इन दोनों मुद्दों को विधानसभा उपनामों का उपयोग करके हल किया जा सकता है, जैसा कि यहां वर्णित है


मुझे पूरा यकीन नहीं है कि यह सच है। यदि आप CIL को देखते हैं, तो CLR कुछ विधानसभाओं के भीतर स्पष्ट रूप से प्रतीकों को दर्शाता है [विधानसभा] प्रत्येक प्रतीक से पहले संकेतन। यह संभव है कि सी # संकलक इस मुद्दे को लागू करता है, लेकिन मुझे नहीं लगता कि यह एक मंच की कमी है।
यम मार्कोविच

@ यम मारकोविक आप एक विशेष वर्ग में किस नामस्थान का उपयोग करने की कोशिश कर रहे हैं? पूरी तरह से योग्य वर्ग नाम संघर्ष निश्चित रूप से एक निर्माण को रोकने के लिए जा रहे हैं।
जेरेमी

सी # कंपाइलर आपको असेंबली अलायसेस के लिए एक विकल्प प्रदान करता है, जब एक ही नाम की असेंबली (और संभवत: उनमें समान सिंबल वाले) मिलते हैं। देखें stackoverflow.com/questions/517058/...
रतालू Marcovic

@ यम - सच है, हालांकि, आपको इस ध्वज के बारे में जानना और इसका उपयोग करना होगा। बस विधानसभा को जोड़ने से निर्माण टूट जाएगा।
Oded

1
जाहिर है। इसलिए वह मदद के लिए यहां आता है, हालांकि, सही है? वह इस ध्वज के बारे में जानना चाहता है और इसका उपयोग करना चाहता है, क्योंकि यह उसे अपनी परियोजना या 3 पार्टी उपयोगिताओं को प्रभावित किए बिना, एक क्लीनर समाधान देगा।
यम मारकोविच

4

यह देखकर कि किसी और ने इसका उल्लेख नहीं किया है, आपने पूछा:

इसे कम करने के संभावित तरीके क्या हैं

इस मामले के लिए एक साफ समाधान है, बिना बाधाओं के, और बिना कष्टप्रद समाधान के। आप असेंबली अलाइज़ को परिभाषित कर सकते हैं ताकि कंपाइलर को पता चल जाए कि कौन सी जगह सही है।

Http://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx पर एक नज़र


3

हां, यह बहुत संभव है।
मान लीजिए कि आपने कुछ DLL का संदर्भ जोड़ा है जो Lucene.Net के पुराने संस्करण का उपयोग करता है और आप नवीनतम संस्करण को शामिल करना चाहते हैं।
आप बाहरी एलियंस का उपयोग करके उस समस्या को हल कर सकते हैं: http://msdn.microsoft.com/en-us/library/ms173212.aspx


+1 यह सही उत्तर लगता है, "बाहरी" उपनाम के बारे में नहीं।
जलयज्ञ

1

आप असेंबली के कई अलग-अलग संस्करणों को रख सकते हैं, जैसा कि आप ग्लोबल असेंबली कैश में चाहते हैं बशर्ते कि वे मजबूत नाम वाले हों। यदि आप अलग-अलग एप्लिकेशन को असेंबली, मशीन-वार के विभिन्न संस्करणों का उपयोग करना चाहते हैं तो यह आपकी मदद कर सकता है। हालांकि एक अनुप्रयोग में एक असेंबली के विभिन्न संस्करणों का उपयोग करना अभी भी आपको परेशानी में डालेगा।

एक ही समय में दोनों संस्करणों की आवश्यकता के लिए आपके पास क्या कारण है?


1
वैसे मैं स्पष्ट रूप से विभिन्न संस्करणों को नहीं जोड़ रहा हूं। मूल रूप से मेरे पास एक WPF ऐप है। अब, तीसरे पक्ष की सुविधा को जोड़ने के लिए, मैंने कुछ DLL जोड़े हैं और यह ये DLL हैं जो शायद विरोध में हैं।
शमीम हाफ़िज़

1
ठीक है, तो आप शायद इन तीसरे पक्ष से संबंधित DLL को GAC में जोड़ सकते हैं? मुझे उन चीजों के बारे में पढ़े हुए काफी समय हो गया है लेकिन मुझे संदेह है कि इससे आपकी समस्या हल हो सकती है।
जलयज्ञ

जीएसी का मतलब यहाँ क्या है?
शमीम हाफ़िज़

1
ग्लोबल असेंबली कैश, देखें msdn.microsoft.com/en-us/library/yf1d93sz%28v=vs.71%29.aspx
जलयान

0

पक्का। आप "अस्पष्ट संदर्भ" संकलक त्रुटि प्राप्त कर सकते हैं, जब दो वस्तुओं को प्रतिष्ठित नहीं किया जा सकता है। आमतौर पर, आप कोड में पूर्ण पथ निर्दिष्ट कर सकते हैं और यह एक समस्या का कारण नहीं होगा, लेकिन यदि dll पूरी तरह से समान थे, तो आप किसी भी तरह से दो ऑब्जेक्ट के बीच अंतर नहीं कर पाएंगे। Sya हमारे पास दो dll हैं:

System.IO जिसमें फ़ाइल वर्ग है

तथा

MyProject.IO जिसमें एक फ़ाइल वर्ग है

अगर तुम कुछ इस तरह से होते ...

using System.IO;
using MyProject.IO;

...
private void foo()
{
    File f = new File();
}

... आपके पास एक अस्पष्ट संदर्भ होगा, क्योंकि यह बताने का कोई तरीका नहीं है कि आप किस फ़ाइल के बारे में बात कर रहे हैं। यह इसे ठीक करेगा:

using System.IO;
using MyProject.IO;

...
private void foo()
{
    MyProject.IO.File f = new MyProject.IO.File();
}

एकमात्र तरीका यह तय करना मुश्किल होगा यदि "फाइल" का पथ दोनों विधानसभाओं में समान था, लेकिन इसके लिए अपेक्षित स्थिति की आवश्यकता नहीं होगी जहां दो dll में एक समान नामस्थान संरचना हो। उदाहरण के लिए, ऊपर की मेरी स्थिति कभी नहीं होगी, क्योंकि कोई भी वहां "सिस्टम" (.Net ढांचे के वास्तविक डेवलपर्स के अपवाद के साथ) परियोजना का नाम नहीं देगा।


वास्तव में यह बहुत कुछ होता है, यदि आप लोकप्रिय तीसरे पक्ष के पुस्तकालयों के आधार पर समाधान बनाते हैं। उदाहरण के लिए, एक ट्विटर लाइब्रेरी आपके json lib के पुराने संस्करण पर निर्भर हो सकती है
Hoàng Long
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.