2012-07-04 6 views
9

नेट दुनिया में सबसे अच्छा अभ्यास सकर्मक निर्भरता कि संस्करण विरोध का कारण प्रबंधन करने के लिए क्या है?सकर्मक निर्भरता एक ही DLL का विरोध करने वाले संस्करण के कारण

विवरण में: परियोजना एक परियोजना बी जो बारी में पुस्तकालय सी पर निर्भर करता है पर निर्भर करता है

भी

प्रोजेक्ट ए भी परियोजना एक्स जो एक अलग और (संभावित) पुस्तकालय की असंगत संस्करण पर निर्भर करता है पर निर्भर करता है सी

A-> बी> Cv1.0
&
A-> एक्स> Cv2.0
जहां
CV> सीवी 2.0

  • क्या यह काम करने का कोई तरीका है?

  • यह GAC का उपयोग कर के बिना किया जा सकता है?

  • यह किया जा सकता है, भले ही बी और एक्स द्विपदीय प्रारूप में केवल (स्रोत सुलभ नहीं) कर रहे हैं?

दूसरे शब्दों में वहाँ एक रास्ता है, जहां मैं जब संघर्ष पैदा करने के बिना परियोजना एक में एक साथ इस्तेमाल के लिए अपने स्वयं निर्भरता का उपयोग कर परियोजना बी और एक्स प्रत्येक हो सकता है।

नोट: मुझे लगता है कि आदर्श रूप में मैं इस समस्या को सभी लेकिन कम से बाहरी पुस्तकालयों पर निर्भरता बढ़ती है के रूप में इस एक अपरिहार्य पक्ष प्रभाव हो जाएगा नहीं होना चाहिए। तो मुझे आश्चर्य है कि यह होना चाहिए कि इससे कैसे निपटना सबसे अच्छा है।

+1

आदर्श रूप में आप फिर से निर्माण करना चाहिए या अद्यतन बी इतना है कि यह सी के वर्तमान संस्करण पर निर्भर करता है कि आप करने के लिए फिर से नक्शा संस्करणों कोशिश कर सकते हैं नहीं कर सकते हैं। http://stackoverflow.com/a/11126867/48082 यह काम करने की गारंटी नहीं है! – Cheeso

+1

सहमत हैं कि आदर्श रूप से किसी को अपनी परियोजनाओं को गंदगी की स्थिति से बचने के लिए साफ करना चाहिए, लेकिन यह हमेशा संभव नहीं है, इसलिए सवाल। – Newtopian

+0

कुछ तरीकों से डीएलएल को रीमेप करना केवल तभी अच्छा होता है जब दोनों संस्करण एक दूसरे के साथ संगत हों। यहां सबसे खराब स्थिति यह है कि यदि वे संगत नहीं हैं, तो प्रत्येक मध्य निर्भरता उस संस्करण का उपयोग करने का एक तरीका है जिसके लिए इसे बनाया गया था और अभी भी मुख्य परियोजना की अपेक्षा की जा रही है। – Newtopian

उत्तर

4

स्टैक ओवरफ़्लो पर इसी तरह के सवाल का एक बहुत हैं। उदाहरण के लिए Referencing 2 different versions of log4net in the same solution

सारांश:

  1. सुनिश्चित करें कि आप मुख्य निष्पादन वाले फ़ोल्डर के भीतर क्रमशः फ़ोल्डरों 1.0 में विधानसभा सी और 2.0 की तैनाती।
  2. app.config बदलें फ़ाइल और निम्नलिखित की तरह कुछ में शामिल हैं:
<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="C" publicKeyToken="C's public key token" /> 
     <codeBase version="version string for C1.0 e.g. 1.0.0.0" href="1.0\C.dll" /> 
     <codeBase version="version string for C2.0 e.g. 2.0.0.0" href="2.0\C.dll" /> 
     </assemblyIdentity> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

आप

v1 तो -टी C.dll एस.एन. का उपयोग कर सी की सार्वजनिक कुंजी टोकन प्राप्त कर सकते हैं। 0 और सी के वी 2.0 में अलग-अलग सार्वजनिक कुंजी हैं (हालांकि आदर्श रूप से उन्हें नहीं करना चाहिए) फिर दो आश्रित एस्क्रिप्बल्स टैग शामिल करें।

+1

वास्तव में कई प्रश्न हैं लेकिन किसी ने वास्तव में मेरे प्रश्न का उत्तर नहीं दिया। असेंबली बाइंडिंग की मेरी समझ यह थी कि यह निर्दिष्ट करने की अनुमति देता है कि कौन सी डीएलएल का उपयोग किया जाता है जिसके लिए नेमस्पेस और तदनुसार कॉल रीडायरेक्ट करना है। यहां प्रत्येक कॉल पथ अंततः एक एकल डीएलएल को लक्षित करेगा। परिदृश्य में मैंने खुलासा किया कि हमारे पास दो समान कॉल पथ हैं जिन्हें दो अलग-अलग डीएलएल को लक्षित करना होगा। केवल अंतर यह है कि प्रत्येक को एक अलग "पैरेंट" डीएलएल से बुलाया जाता है। ऐसा तब तक है जब तक मैं असेंबली बाइंडिंग के उद्देश्य को सही ढंग से समझ नहीं पाया। – Newtopian

+0

था ने कहा कि मुझे लगता है कि यदि उपरोक्त उदाहरण में दो निर्भरताओं (बी और एक्स) के प्रकाशक को विशेष रूप से डीएलएल निर्भरता (सी उपरोक्त) संस्करणों को हार्डवायर करना था, तो उनके पुस्तकालयों का उत्पादन करते समय सब कुछ काम करेगा (दोनों सी डीएल विशिष्ट रूप से पहचाने जाने योग्य हैं फाइलें यानी अलग-अलग नाम और/या पथ)। मुझे असेंबली के साथ थोड़ा प्रयोग करना होगा बाध्यकारी देखें कि क्या किया जा सकता है – Newtopian

+0

यदि सी दृढ़ता से नामित किया गया है, तो ऊपर काम करना चाहिए और बी और एक्स के लिए सी के सही संस्करण को लोड करने में सक्षम होना चाहिए। यदि इसका दृढ़ता से नाम नहीं है लेकिन अभी भी एक संस्करण है (जैसा कि असेंबली वर्जन एट्रिब्यूट के माध्यम से निर्दिष्ट है) तो आप publicKeyToken को हटाने के साथ प्रयोग कर सकते हैं और देख सकते हैं कि यह अभी भी काम करता है या नहीं। अगर यह काम नहीं करता है, तो मुझे लगता है कि केवल आशा है कि असेंबली रिसेल्व घटना होगी। मैं इन सभी ifs और buts को जांचने और परिणामों को साझा करने का प्रयास करूंगा। –

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