कैसे मैं बदलते publickeytoken रखते हुए log4net के आसपास काम करते हैं


99

हमारे पास एक asp.net 4.0 परियोजना है जो चौखटे का उपयोग करती है जो log4net संस्करण 1.2.10.0 पर निर्भर है। आज मैंने एक नया ढाँचा शामिल करने की कोशिश की जो log4net संस्करण 1.2.11.0 पर निर्भर है, मैं तब से अटका हुआ हूँ:

log4net 1.2.10.0 में publickeytoken = 1b44e1d426115821 है

log4net 1.2.11.0 में publickeytoken = 669e0ddf0bb1aa2a है

चूंकि ये अलग-अलग होते हैं इसलिए मैं या तो असेंबली रीडायरेक्ट का उपयोग नहीं कर सकता (सभी चौखटे बनाने के लिए log4net के एक ही संस्करण का उपयोग करें) या webbconig में रनटाइम एलिमेंट के माध्यम से कोडबेस (सिर्फ नया फ्रेमवर्क संस्करण 1.2.11.0 का उपयोग करने के लिए)।

मेरे लिए यहां क्या विकल्प हैं ?

(और क्यों ब्लिप करता है log4net संस्करणों के बीच publickeytokens को बदलते रहता है, जैसा कि मैं समझता हूं कि यह एक खोई हुई कुंजी संस्करण 1.2.9.0 और 1.2.10.0 के बीच स्विच का कारण थी, क्या उन्होंने कुंजी को फिर से खो दिया था? मैं अपने ड्रॉपबॉक्स को स्वयंसेवा करूंगा? यदि उन्हें इसकी आवश्यकता हो तो इसे सुरक्षित रखने के लिए ...)

संपादित करें: ठीक है, तो log4net लोग जाहिरा तौर पर यह विचार है कि दो कुंजी के साथ जारी एक अच्छा विचार था, लेकिन उस का मतलब है कि था कि हर ढांचे आप की जरूरत का उपयोग करने के सहमत होने के लिए पर जो दो जायके वे पसंद करते हैं, या उन चौखटे नहीं काम कर सकते हैं पक्ष की उसी अपडोमेन की तरफ से। क्या मैं केवल यह एक भयानक विचार पा रहा हूं? अगर सभी ने ऐसा किया तो सब कुछ टूट जाएगा, है ना?

Edit2: जैसा कि मैंने कहा, मैं अपने व्यवसाय कोड में log4net का उपयोग नहीं कर रहा हूं, लेकिन मैं कई रूपरेखाओं का उपयोग करता हूं जो 1.2.10.0 पर निर्भर हैं, और समस्या तब पैदा हुई जब मैंने 1.2.11.0 (नई कुंजी) पर निर्भर एक नए ढांचे का उपयोग करने की कोशिश की ), इसलिए स्टेफन्स जवाब लागू नहीं होता है, क्योंकि नई रूपरेखा नई कुंजी की उम्मीद करेगी, पुरानी नहीं


1
IMHO, यहाँ अपाचे से पहली त्रुटि यह है कि बायनेरिज़ को नई कुंजी के साथ हस्ताक्षरित प्रदान करना है: नई कुंजी पैचेड / एन्हांस्ड ओपन सोर्स संस्करण के लिए अभिप्रेत है और इसका उपयोग नहीं किया जाना चाहिए। दूसरी त्रुटि यह है कि जिस फ्रेमवर्क के बारे में आप बात कर रहे हैं, वह केवल नए log4net हस्ताक्षर के साथ जारी किया गया है: पुराने हस्ताक्षर वाला संस्करण मौजूद होना चाहिए।
जोबिली

6
वास्तव में, आप तीसरे स्वाद को देख रहे हैं: SAP में एक जीनियस ने विजुअल स्टूडियो पैकेज के लिए क्रिस्टल रिपोर्ट के भाग के रूप में अपने स्वयं के मजबूत नाम के साथ पुन: संकलित किया, और मामले को बदतर बनाने के लिए, उन्होंने इसे जीएसी में अटका दिया, जो इसे बनाएगा मशीनों पर आपकी निर्भरता एक बुरा सपना है।
जेरेमी होलोवाक्स

जवाबों:


65

इस तरह मुझे 1.2.11.0 संस्करण के साथ काम करने वाली चीजें मिलीं।

  1. पहले स्थान पर चाबी बदलने के लिए अपाचे को शाप :)
  2. पुरानी कुंजी के साथ हस्ताक्षरित 1.2.11.0 का संस्करण डाउनलोड करें।
  3. Log4net (नई कुंजी) के लिए किसी भी सीधे संदर्भ को हटाकर अपने स्वयं के कोड को छाँट लें और पुरानी कुंजी के साथ हस्ताक्षरित विधानसभा के संदर्भ में बदलें।
  4. अपने वेब / app.config में इस सेगमेंट को शामिल करके किसी भी आश्रित असेंबली को छाँट लें
   <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-1.2.10.0"
                                 newVersion="1.2.11.0"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>

9
पुरानी सार्वजनिक कुंजी के साथ हस्ताक्षरित संस्करण को डाउनलोड करना आवश्यक है क्योंकि दुर्भाग्य से एक अलग सार्वजनिक कुंजी के साथ विधानसभा के लिए बाध्यकारी पुनर्निर्देशन करना संभव नहीं है।
डेविड क्रिस्टियनजेन

2
1.2.11.0 में एक ब्रेकिंग परिवर्तन के कारण यह विफल हो रहा है: netpl.blogspot.com/2012/03/…
sydneyos

क्या किसी को @sydneyos द्वारा बताई गई लिंक पर वर्णित समस्याओं का हल मिल गया है जो निम्न अपवाद का कारण बनता है:Method not found: 'Void log4net.Config.BasicConfigurator.Configure()'
Neo

दुर्भाग्य से 1.2.10 पर अपग्रेड करने के अलावा कोई उपाय नहीं है। (या आपके द्वारा उपयोग की जाने वाली प्रत्येक निर्भर असेंबली को पुनः स्थापित करना)।
21

1
1.2.10 असेंबली को एक अलग निर्देशिका में रखें और इस कॉन्फिगर का उपयोग करें: '<dependAssembly> <असेंबलीडेंटिटी नाम = "log4net" publicKeyToken = "1b44e1d426115821" कल्चर = "तटस्थ" /> <बाइंड्रायड्रेड पुरानीवेटेशन = "0.0.0.0-1.2.9.9.0 "newVersion =" 1.2.10.0 "/> <codeBase संस्करण =" 1.2.10.0 "href =" संसाधन \ log4net-oldkey \ log4net.dll "/> </ dependAssembly> '
Agile

27

मैं log4net के नवीनतम संस्करण का उपयोग कर रहा हूं जिसे मैंने nuget के माध्यम से डाउनलोड किया है। हालाँकि, मैं जिन पुस्तकालयों का उपयोग कर रहा हूं उनमें से एक को पुराने संस्करण की आवश्यकता है। मेरी परेशानियों ने मुझे इस सवाल पर पहुँचा दिया।

अन्य उत्तरों के साथ समस्या यह है कि वे सभी बाइंडिंग के लिए एक ही dll संस्करण का उपयोग कर रहे हैं। मैं बाकी सभी चीजों के लिए नए संस्करण में सुविधाओं का उपयोग करना चाहता हूं लेकिन विरासत पर निर्भरता है।

ऐसा करने में सक्षम होने के लिए आपको निम्नलिखित करने की आवश्यकता है:

  1. पुराने संस्करण (1.2.11.0 का संस्करण) को डाउनलोड करके शुरू करें ।
  2. डाउनलोड किए गए बाइनरी का नाम बदलें log4net.1.2.10.dll। के साथ अपने स्टार्टअप परियोजना में शामिल कार्रवाई बिल्ड करने के लिए सेट None"यदि नए कॉपी" और यहां छवि विवरण दर्ज करें
  3. .NET को बताएं कि यह पुराना संस्करण कहां मिल सकता है:

app.config

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" />
            <codeBase version="1.2.10.0" href="log4net.1.2.10.dll" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

hrefपहचान करता है पुराने संस्करण है, जहां जिम्मेदार बताते हैं। इसलिए log4net के लिए अन्य सभी अनुरोध नए संस्करण पर इंगित करेंगे।


4
यह एक महान समाधान है क्योंकि यह आपको पुस्तकालयों के लिए दोनों संस्करणों को बनाए रखने की अनुमति देता है जो या तो संदर्भ देते हैं।
साउथशोरैक

2
धन्यवाद! इससे मैं बच गया। मुझे "कॉपी टू आउटपुट निर्देशिका" को "कॉपी न करें" में बदलना था, लेकिन अन्यथा यह एक आकर्षण की तरह काम करता था!
डेनियल हेडेनस्ट्रॉम

3

आप log4net 1.2.11.0 का एक संस्करण डाउनलोड कर सकते हैं जो पुरानी कुंजी के साथ हस्ताक्षरित है। एक नई कुंजी को बदले जाने का कारण उनके FAQ में बताया गया है:

http://logging.apache.org/log4net/release/faq.html#two-snks

(मूल रूप से नई कुंजी सार्वजनिक रूप से उपलब्ध है और किसी कारण से वे वितरण में पुरानी कुंजी को शामिल नहीं करना चाहते थे। यह मेरे लिए स्पष्ट नहीं है कि उन्होंने पुरानी कुंजी को सार्वजनिक रूप से उपलब्ध क्यों नहीं कराया है)


10
लेकिन जब मैं किसी तीसरे पक्ष के पुस्तकालय का उपयोग करता हूं जो नई कुंजी से बंधा होता है, तो मैं अभी भी अटक जाता हूं (दाएं?)। नए log4net का उपयोग करना मेरी पसंद नहीं है , यह थर्ड पार्टी फ्रेमवर्क है। मैं यह नहीं देख सकता कि यह सामान हर किसी के चेहरे पर
उड़ने

यह दुर्भाग्य से सही है। मुझे लगता है कि आप सभी घटकों log4net के एक ही संस्करण का उपयोग नहीं करने पर विचार करने की जरूरत है ...
Stefan Egli

1
.... और मैं ऐसा कैसे करूंगा? क्या इस समस्या से निपटने के लिए .net में कोई व्यवस्था है?
एंड्रियास्कैनड्सन

हाँ, वहाँ है: stackoverflow.com/questions/3158928/…
ms007

1

नहीं जानते कि यह आपके विशेष मामले के लिए उपयुक्त है या नहीं, लेकिन आप किसी एक ढांचे को फिर से जोड़ सकते हैं, इसलिए वे उसी सार्वजनिक कुंजी के साथ log4net का उपयोग करेंगे। मेरे मामले में यह FluentNHibernate था जो log4net 1.2.10 और नई कुंजी के साथ log4net 1.2.11 के साथ Combres का उपयोग करता है। मैंने log4net 1.2.11 को पुरानी कुंजी के साथ हस्ताक्षरित किया और इसके साथ संयोजन को फिर से जोड़ा। उसके बाद असेंबली बाइंडिंग को 1.2.10 से 1.2.11 तक रीडायरेक्ट किया गया और यह काम करना शुरू कर देता है।


0

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


0

मैंने ऊपर दिए गए लिंक पर जाने की कोशिश की, लेकिन ऐसा लगता है कि अपाचे साइट के सभी लिंक काम नहीं कर रहे हैं। फिर इस मुद्दे को हल करने के लिए मैंने ऐसा किया:

अपने विजुअल स्टूडियो से, log4net (1.2.13.0) के नवीनतम संस्करण को डाउनलोड और इंस्टॉल करने के लिए Nuget का उपयोग करें। NuGet पैकेज मैनेजर स्वचालित रूप से सभी log4net (1.2.11.0) को नवीनतम संस्करण में डाउनलोड और अपग्रेड करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.