एक ही समाधान में log4net के 2 अलग-अलग संस्करणों को संदर्भित करना


80

मैं NHibernate 2.1.2.400 का उपयोग कर रहा हूं जो log4net 1.2.10.0 को संदर्भित कर रहा है। एक ही परियोजना में, मैं भी बस लेखांकन एसडीके का उपयोग करता हूं, दुख की बात है कि यह अभी भी log4net 1.2.9.0 का उपयोग कर रहा है।

तो मैं काम करने के लिए NHibernate प्राप्त कर सकता हूं अगर मैं log4net 1.2.10.0 को संदर्भित करता हूं, लेकिन बस एसडीएसके काम नहीं करता है। और इसके विपरीत...

मैं अनुमान लगा रहा हूं कि अधिकांश समस्याएं इस तथ्य से आती हैं कि log4net ने अपनी विधानसभा कुंजी बदल दी है। मैंने सफलता के बिना एक बाध्यकारी पुनर्निर्देशन का उपयोग करने की कोशिश की: 2 डीएलएल में एक ही कुंजी नहीं है।

मैं log4net 1.2.9.0 का उपयोग करने के लिए NHibernate को फिर से शुरू करने पर विचार कर रहा हूं, लेकिन ऐसा करना गलत काम लगता है और मेरी भावना यह है कि बस लेखांकन कभी भी जल्द ही log4net 1.2.10.0 का उपयोग करने के लिए अपने एसडीके को अपडेट नहीं करेगा।

इसे संभालने का सबसे अच्छा तरीका क्या है? क्या इसका समाधान संभव है?


2
मैं stackoverflow.com/questions/1744543/… पर बहुत ही समान प्रश्न करता हूं। मैंने पुनर्मूल्यांकन का सहारा लिया। मुझे लगता है कि यह dll-hell v2.0 का आगमन है।
सांडोर ड्रीयनहुइज़न

1
आपके प्रश्न की जाँच करते समय मुझे स्टैकओवरफ़्लो. com/ questions/2460542/ 2461746#2461746 मिला जिसने मेरी समस्या को ठीक किया।
जोएल गॉवरेउ

महान! मैं अलग-अलग स्थानों में सीएलआर लुक बनाने के बारे में सोच रहा था और hrefविशेषता यह है कि इस ट्रिक को किया जाए। यह बात बताने के लिए धन्यवाद!
Sandor Drieënhuizen

जवाबों:


149

मैंने इसी तरह के प्रश्न के उत्तर का उपयोग करके समाधान पाया

आप log4net के प्रत्येक संस्करण के लिए अपनी परियोजना में 2 फ़ोल्डर बनाते हैं। प्रत्येक log4net.dll को एक संगत फ़ाइल में समाधान में एक फ़ाइल जोड़कर (संदर्भ के साथ नहीं) जोड़ें। आप आउटपुट डायरेक्टरी प्रॉपर्टी को कॉपी को हमेशा कॉपी करने के लिए सेट कर सकते हैं ताकि जब आप निर्माण करें तो यह स्वचालित रूप से आउटपुट फ़ोल्डर में कॉपी हो जाए।

फिर आप app.config फ़ाइल को कुछ इस तरह से जोड़कर संशोधित करते हैं:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="681549d62126b7b8" />
        <codeBase version="1.2.9.0" href="log4netv1.2.9.0\log4net.dll" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" />
        <codeBase version="1.2.10.0" href="log4netv1.2.10.0\log4net.dll" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" />
        <codeBase version="1.2.11.0" href="log4net.dll" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

आप एस-टी का उपयोग करके किसी विधानसभा का सार्वजनिक कुंजी टोकन प्राप्त कर सकते हैं [विधानसभा नाम]


2
यह मेरे लिए भी काम करने लगता है। मैंने प्रोजेक्ट के लिए अपनी संदर्भ सूची से log4net को हटा दिया था, जहां संघर्ष हो रहा था। इसके अलावा, चूंकि log4net.dll मेरे बिन फ़ोल्डरों में नहीं है, इसलिए मेरे href पथ ".. \ _ \ _ \ _ \" \ Lib \ NHibernate-2.0.1.GA \ log4net.dll जैसे दिखते थे - बस एक जहां हमारे निर्माण प्रणाली के साथ हर देव मशीन पर log4net होगा के सापेक्ष पथ।
ज्योनदेवदेव

12
मुझे यकीन नहीं है कि मुझे यह मिल गया है: अगर लॉग 4नेट को संदर्भित नहीं किया गया है तो आपको संकलन त्रुटियों को कैसे नहीं मिलेगा?
गाइडअपयू

2
यह बहुत बढ़िया है, यह अन्य मामलों को ठीक करेगा जहां एक साधारण बाइंडिंग रीडायरेक्ट एपीआई परिवर्तनों के कारण चीजों को तोड़ देगा!
Rhys बेविलाक्वा

5
@guidupy आप अपने कोड का उपयोग करने वाले log4net को संदर्भित कर सकते हैं, लेकिन गुणों में copyLocal को बंद कर सकते हैं।
जेफ मार्टिन

4
भविष्य के पाठकों के लिए (एक संकेत जो मुझे एक अन्य उत्तर से मिला, लेकिन यहाँ पोस्ट करने के लिए विवेकपूर्ण है ...) वेब-अनुप्रयोगों (asp.net) के लिए, संदर्भ में एक ट्वीक है: <codeBase संस्करण = "1.0.0.0" href = "बिन \ फ़ोल्डर \ namell.dll "/>
ग्रेनाडोडर

7

आप रजिस्ट्री में एक बहिष्करण जोड़ सकते हैं। बस इन कुंजियों को जोड़ें:

HKEY_LOCAL_MACHINE\Software\Microsoft\StrongName\Verification\log4net,681549d62126b7b8
HKEY_LOCAL_MACHINE\Software\Microsoft\StrongName\Verification\log4net,1b44e1d426115821
HKEY_LOCAL_MACHINE\Software\Microsoft\StrongName\Verification\log4net,669e0ddf0bb1aa2a

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


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

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

3

यदि बाइंडिंग पुनर्निर्देशन काम नहीं करता है और बस लेखांकन एसडीके स्रोत बंद है, तो लॉगबनेट 1.2.9.0 का उपयोग करने के लिए एनएचबर्नेट को फिर से जमा करना एक संभावित समाधान है।


3
यह काम करेगा, लेकिन nberberate का एक विशेष संस्करण बनाने के लिए लाइन का समर्थन करना कठिन होगा ... धन्यवाद।
जोएल गौव्रेउ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.