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




visual-studio-2012 dll (7)

मेरे पास एक ही समस्या है और यह पता चला है कि सी: \ प्रोग्राम फ़ाइलें \ माइक्रोसॉफ्ट एसडीके \ विंडोज 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 का नाम बदलने / हटाने के बाद, विजुअल स्टूडियो मेरे संदर्भित संस्करण को बदलने के लिए रोक रहा था और वेबसाइट फिर से काम करना शुरू कर देती है।

विजुअल स्टूडियो 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 के लिए कहीं भी कोई संदर्भ नहीं है)। और वेबसाइट में मेरे पास 'कॉपी लोकल' सेट सही है और न्यूटॉन्सॉफ्ट.जेसन.डीएलएल के लिए 'विशिष्ट संस्करण' भी सही है।


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

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

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


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

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


यह विंडोज एज़ूर वीएस टूल्स में एक ज्ञात बग है

समाधान:

  • प्रोग्राम फ़ाइलों \ Microsoft SDKs \ Windows Azure.NET SDK \ v2.3 \ ref \ फ़ोल्डर से Newtonsoft.Json.dll फ़ाइल निकालें।

  • विंडोज़ एज़ूर वीएस टूल्स वी 2.3 अनइंस्टॉल करें


समस्या

आपके 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 का उपयोग करता हूं, समस्या मेरे अनुप्रयोग में अन्य प्रोजेक्ट का एक अप्रयुक्त संदर्भ था जो न्यूटन सॉफ्ट के पुराने संस्करण का उपयोग करती है। मैं संदर्भ को खत्म करता हूं और डीएलएल और नहीं बदला गया था।


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

फ्यूजन लॉग का उपयोग करके उन्हें एक-एक करके कोशिश करने के बाद अंत में मैं न्यूटॉन्सॉफ्ट.जेएसओएनएलएल के सभी संदर्भों को बदलकर बाहर चला गया, जिसमें प्रोग्राम फाइलों का एक ही गलत संस्करण है:

  • 'सी: \ प्रोग्राम फ़ाइलें (x86) \ Microsoft SDKs \ Microsoft Azure \ Mobile Services \ 1.0'
  • 'सी: \ प्रोग्राम फ़ाइलें \ सामान्य फ़ाइलें \ माइक्रोसॉफ्ट साझा \ विजुअल स्टूडियो \ 12.0'
  • 'सी: \ प्रोग्राम फ़ाइलें (x86) \ माइक्रोसॉफ्ट विजुअल स्टूडियो 12.0 \ ब्लेंड'
  • आदि।

त्वरित युक्ति: विवरण के तहत एक्सप्लोरर में 'उत्पाद संस्करण' को कॉलम के रूप में जोड़ें और इसके द्वारा क्रमबद्ध करें:

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





.net-4.5