c# - विजुअल स्टूडियो पुराने संस्करण के साथ न्यूटनसोफ्ट.जेसन.डीएलएल को ओवरराइट करना जारी रखता है




visual-studio-2012 dll (6)

विजुअल स्टूडियो NewtonSoft.Json.DLL के सही संस्करण को ओवरराइट कर रहा है जिसे मैंने अपने प्रोजेक्ट संदर्भों और NuGet पैकेज फ़ाइल में पुराने संस्करण के साथ कॉन्फ़िगर किया है जब मैं किसी अन्य प्रोजेक्ट को संदर्भित करता हूं जिसमें वेबसाइट शामिल है।

ठीक। परिदृश्य यहां है:

मेरे पास बैकएंड सेवा और वेबसाइट के साथ समाधान है। वेबसाइट .NET 4.5 पर चल रही है और Newtonsoft.Json.DLL के संस्करण 6.0.1 में खींचने के लिए NuGet के साथ कॉन्फ़िगर किया गया है।

<package id="Newtonsoft.Json" version="6.0.1" targetFramework="net45" />

जो web.config फ़ाइल में बाध्यकारी निर्भर Assembly जोड़ता है।

  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
  </dependentAssembly>

मैं बिना किसी समस्या के इस वेबसाइट को बना और चला सकता हूं।

मैंने हाल ही में सभी कक्षा पुस्तकालयों और बैकएंड सेवा को .NET 4.0 से .NET 4.5 तक अपडेट किया है। अद्यतन के बाद, जब भी मैं कक्षा पुस्तकालयों में से एक बनाता हूं या बैकएंड सेवा चला / डीबग करता हूं, तो वेबसाइट निष्क्रिय हो जाती है।

Could not load file or assembly 'Newtonsoft.Json' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

मैंने इस तथ्य को ट्रैक किया कि क्लास लाइब्रेरी में से किसी एक को पुनर्निर्माण या विजुअल स्टूडियो से बैकएंड सेवा चलाने / डिबग करने पर, न्यूटॉन्सॉफ्ट.जेसन.डीएलएल फ़ाइल के पुराने संस्करण - संस्करण 4.5.11 के साथ अधिलेखित हो जाता है। स्पष्ट निर्भर Assembly बाध्यकारी के कारण, जब भी मैं वेबसाइट का उपयोग करता हूं उसके बाद मुझे उपरोक्त वर्णित 'लोड नहीं हो सका ...' त्रुटि मिलती है।

यह ठीक होगा अगर मैं सिर्फ एक या दूसरी बैकएंड सेवा या वेबसाइट को चलाने के लिए चाहता था, लेकिन मुझे अपने आवेदन को ठीक से चलाने के लिए दोनों को एक साथ चलाने की ज़रूरत है। लेकिन इस त्रुटि के कारण मुझे वेबसाइट या वेबसाइट क्रैश होने पर बैकएंड सेवा एक ही समय में चल सकती है।

मैं विजुअल स्टूडियो को डीएलएल को ओवरराइट करने से कैसे रोकूं?

ध्यान दें कि मेरे पास पूरे समाधान में केवल 6.0.1 के लिए संदर्भ सेट है (यानी 4.5.11 के लिए कहीं भी कोई संदर्भ नहीं है)। और वेबसाइट में मेरे पास 'कॉपी लोकल' सेट सही है और न्यूटॉन्सॉफ्ट.जेसन.डीएलएल के लिए 'विशिष्ट संस्करण' भी सही है।


समस्या

आपके csproj में न्यूटॉन्सॉफ्ट.जेसन डीएल के अमान्य पथ के साथ एक संदर्भ है। मेरे मामले में, यह था

<HintPath>..\..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll</HintPath>

एक NuGet के बजाय सेट किया जाना चाहिए , packages\Newtonsoft.Json.8.0.3\... (संस्करण संस्करण सहित)।

चूंकि वीएस को डीएल नहीं मिल रहा है, यह सिर्फ आपके सिस्टम पर खोज करेगा, और इसे ढूंढने वाले पहले व्यक्ति का उपयोग करेगा। मेरे सिस्टम पर, वह Azure SDK 2.9 था, फिर Azure SDK 2.8, फिर VS12 / Blend / ....

समाधान

उपर्युक्त कुछ समाधान (आपके सिस्टम में पाए गए सभी न्यूटॉन्सॉफ्ट.जेसन.dlls को हटाकर) छोटी अवधि में समस्या को छिपा सकता है, लेकिन सही NuGet- आपूर्ति किए गए पथ को इंगित करने के लिए केवल csproj को ठीक करने से समस्या वास्तव में हल हो जाएगी।

यही है, सुनिश्चित करें कि आपके csproj में हिंटपाथ पैकेज पथ से मेल खाता है जहां NuGet पैकेज स्थापित है।

यदि आपके पास बैश है, तो आप इसका उपयोग कर सकते हैं

$ grep -r HintPath * | grep Newtonsoft

अपमानजनक csproj खोजने के लिए अपने समाधान की मूल निर्देशिका में।

संबंधित त्रुटियां

यदि आपको यह समस्या है, तो web.config में स्पष्ट रीडायरेक्ट के साथ अपनी Asp.Net साइट प्रारंभ करना त्रुटि संदेश में निम्न पाठ के साथ अपवाद पृष्ठ के साथ विफल हो सकता है:

लॉग: नए यूआरएल newtonsoft जेसन डाउनलोड करने का प्रयास

डब्लूआरएन: असेंबली नाम की तुलना में विसंगति हुई: मेजर वर्जन

भले ही कुछ प्रोजेक्ट्स न्यूटॉन्सॉफ्ट.जेसन 8.x के NuGet का संदर्भ रखते हैं, वीएस खुशी से संकलित हो जाएगा, फिर उस डीएलएल को सिस्टम पर पाए जाने वाले प्राचीन के साथ ओवरराइट करें, और रनटाइम पर असफल हो।


मुझे एक ही समस्या है, सभी समाधानों का परीक्षण करने के बाद मुझे त्रुटियां मिलती रहती हैं। ऐसा लगता है कि यह त्रुटि कई कारणों से हो सकती है।

मेरे मामले में मैं वीएस 2015 का उपयोग करता हूं, समस्या मेरे अनुप्रयोग में अन्य प्रोजेक्ट का एक अप्रयुक्त संदर्भ था जो न्यूटन सॉफ्ट के पुराने संस्करण का उपयोग करती है। मैं संदर्भ को खत्म करता हूं और डीएलएल और नहीं बदला गया था।


मेरे पास एक ही समस्या है और यह पता चला है कि सी: \ प्रोग्राम फ़ाइलें \ माइक्रोसॉफ्ट एसडीके \ विंडोज Azure.NET SDK \ v2.3 \ ref में मेरे पास Newtonsoft.Json.dll है जो उसी तारीख और समय के समान है whas मेरी वेबसाइट फ़ोल्डर में कॉपी किया।

C: \ Program Files \ Microsoft SDKs \ Windows Azure.NET SDK \ v2.3 \ ref में Newtonsoft.Json.dll का नाम बदलने / हटाने के बाद, विजुअल स्टूडियो मेरे संदर्भित संस्करण को बदलने के लिए रोक रहा था और वेबसाइट फिर से काम करना शुरू कर देती है।


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


यहां मेरी स्थिति है।
समाधान में 3 परियोजनाएं। प्रोजेक्ट्स ए और बी ने Newtonsoft.Json.DLL 6.0.3 और परियोजना सी के लिए एक समाधान संदर्भ का संदर्भ दिया है। परियोजना सी के पास Newtonsoft.Json.DLL कोई स्पष्ट संदर्भ नहीं है।
समाधान का निर्माण करते समय यह सी बनाता है, फिर ए और बी - बिन में सही डीएल को छोड़ देता है। लेकिन जब मैं केवल सी वीएस बनाता हूं तो ए और बी के डीएल के पुराने संस्करण को छोड़ देता है क्योंकि कोई स्पष्ट संदर्भ या बाध्यकारी रीडायरेक्ट मौजूद नहीं है, यह इसे जीएसी से ले जा रहा है। इसके अलावा बिल्डिंग केवल बी में पुराने डीएल को छोड़ देता है, क्योंकि यह पहली बार ए और बी में गलत संस्करण को छोड़ देता है, फिर ए को सही संस्करण डालता है।

यहां समाधान है - स्पष्ट रूप से प्रोजेक्ट सी में Newtonsoft.Json.DLL 6.0.3 जोड़ें


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

निवेश के बहुत समय बाद, हमने पाया कि यह हमारे बिल्ड एजेंट पर Azure SDK का एक नया संस्करण स्थापित करने के द्वारा स्थानीय स्तर पर था: 2.9 के बजाय 2.9।

हमने जिस कामकाज की खोज की थी, उसे समाधान में हर परियोजना में न्यूटॉन्सॉफ्ट.जेसन नुगेट पैकेज शामिल करना था, भले ही परियोजना को संदर्भ की आवश्यकता न हो।





.net-4.5