.net - चेतावनी: एक ही निर्भर असेंबली के विभिन्न संस्करणों के बीच संघर्ष मिला


मैं वर्तमान में एक। NET अनुप्रयोग विकसित कर रहा हूं, जिसमें 20 परियोजनाएं शामिल हैं I उन कुछ परियोजनाओं को .NET 3.5 का उपयोग करते हुए संकलित किया जाता है, कुछ अन्य अभी भी .NET 2.0 प्रोजेक्ट (अब तक कोई समस्या नहीं है)।

समस्या यह है कि अगर मैं एक बाहरी घटक शामिल करता हूं तो मुझे हमेशा निम्न चेतावनी मिलती है:

"Found conflicts between different versions of the same dependent assembly".

यह चेतावनी क्या ठीक कहती है और क्या इस चेतावनी को छोड़ने की संभावना हो सकती है (स्रोत-कोड फ़ाइलों में #प्रगमा अक्षम करना जैसे)?




Answers


इस चेतावनी का मतलब है कि दो परियोजनाएं एक ही विधानसभा (जैसे System.Windows.Forms ) को संदर्भित करती हैं, लेकिन दो परियोजनाओं को विभिन्न संस्करणों की आवश्यकता होती है। आपके पास कुछ विकल्प हैं:

  1. सभी प्रोजेक्ट को उसी संस्करण का उपयोग करने के लिए दोहराएं (जैसे सभी को नेट 3.5 पर ले जाएं)। यह पसंदीदा विकल्प है क्योंकि सभी कोड उन निर्भरताओं के संस्करणों के साथ चल रहे हैं जिनके साथ वे संकलित हुए थे।

  2. बाध्यकारी रीडायरेक्ट जोड़ें यह चेतावनी को दबानेगा। हालांकि, आपके .Net 2.0 प्रोजेक्ट्स (रनटाइम पर) System.Windows.Forms असेंबलियों जैसे .Net 3.5 संस्करणों के लिए बाध्य होंगे जैसे कि System.Windows.Forms आप विज़ुअल स्टूडियो में त्रुटि पर डबल क्लिक करके एक बाध्यकारी रीडायरेक्ट जोड़ सकते हैं।

  3. CopyLocal=true उपयोग करें मुझे यकीन नहीं है कि यह चेतावनी को दबानेगा। यह ऊपर विकल्प 2 की तरह होगा, इसका मतलब यह है कि सभी परियोजनाएं सिस्टम।

अपमानजनक संदर्भ (एस) की पहचान करने के लिए यहां एक उपयोगिता है:

https://gist.github.com/1553265




असल में यह तब होता है जब आप जो सम्मेलनों को संदर्भित कर रहे हैं "प्रतिलिपि लोकल" सेट "सच" है, जिसका अर्थ है कि DLL की एक कॉपी आपके exe के साथ बिन फ़ोल्डर में रखी गई है।

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

जिस तरह से मैं इसके आस पास मिल चुका हूं, उसे असेंबली परियोजनाओं में संदर्भ के लिए प्रतिलिपि स्थानीय से गलत सेट करना है। केवल निष्पादन योग्य / वेब अनुप्रयोगों के लिए ऐसा करें जहां आपको समाप्त उत्पाद चलाने के लिए विधानसभा की आवश्यकता होती है

आशा है कि समझ में आता है!




मैं ऊपर दिए गए टिप्पणियों में प्रदान किए गए पलोवा के समाधान को पोस्ट करना चाहता था। मेरा मानना ​​है कि यह अपमानजनक सन्दर्भ खोजने के लिए सबसे अच्छा समाधान है।

"अपमानजनक संदर्भ (ओं)" क्या हैं, यह खोजने के लिए सबसे आसान तरीका बिल्ड आउटपुट वर्बोज्यता (उपकरण, विकल्प, प्रोजेक्ट्स और सॉल्यूशन, बिल्ड और रन, एमएसब्ल्यूइल्ड प्रोजेक्ट बिल्ड आउटपुट वर्बोसिटी, विस्तृत) सेट करने और निर्माण के बाद, आउटपुट विंडो में खोजें चेतावनी के लिए बस इसके ऊपर के पाठ को देखें

उदाहरण के लिए, जब आप "संघर्ष" के लिए आउटपुट पैनल खोजते हैं तो आपको ऐसा कुछ मिल सकता है:

3>  There was a conflict between "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
3>      "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was chosen because it was primary and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was not.

जैसा कि आप देख सकते हैं, ईएफ संस्करण 5 और 6 के बीच एक संघर्ष है।




मेरी अपनी एक परियोजना के साथ भी यही समस्या थी, हालांकि, उपरोक्त में से कोई भी चेतावनी को हल करने में मदद नहीं करता है। मैंने विस्तृत निर्माण लॉगफाइल की जाँच की, मैंने एएसएमएसपी का उपयोग करने के लिए सत्यापित किया कि मैंने प्रभावित समाधान में प्रत्येक प्रोजेक्ट के सही संस्करणों का इस्तेमाल किया है, मैंने प्रत्येक प्रोजेक्ट फ़ाइल में वास्तविक प्रविष्टियों की दोहरी जांच की - कुछ भी मदद नहीं की

आखिरकार यह पता चला कि समस्या एक प्रोजेक्ट में दिए गए संदर्भों में से एक की नेस्टेड निर्भरता थी। इस संदर्भ (ए) को बदले में (बी) का एक अलग संस्करण की आवश्यकता है जो मेरे समाधान में सीधे अन्य सभी परियोजनाओं से संदर्भित था। संदर्भित प्रोजेक्ट में संदर्भ को अद्यतन करना इसे हल किया

Solution A
+--Project A
   +--Reference A (version 1.1.0.0)
   +--Reference B
+--Project B
   +--Reference A (version 1.1.0.0)
   +--Reference B
   +--Reference C
+--Project C
   +--Reference X (this indirectly references Reference A, but with e.g. version 1.1.1.0)

Solution B
+--Project A
   +--Reference A (version 1.1.1.0)

मुझे आशा है कि उपर्युक्त से पता चलता है कि मेरा क्या मतलब है, पता लगाने में कुछ घंटे लग गए, इसलिए उम्मीद है कि किसी और को भी लाभ होगा।




मुझे सिर्फ यह चेतावनी संदेश था और समाधान को साफ किया और फिर से कंपाइल किए गए (बिल्ड -> क्लीन समाधान) और यह चले गए




मेरे पास एक ही समस्या थी और मैंने निम्नलिखित में वेब। कॉन्फ़िग में बदल कर हल किया

यह मेरे साथ हुआ क्योंकि मैं Newtonsoft.Json 4.0 का उपयोग कर आवेदन चला रहा हूँ

से:

<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>

सेवा मेरे:

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



विजुअल स्टूडियो पर अगर आप समाधान पर राइट क्लिक करते हैं और नूगेट पैकेज को प्रबंधित करते हैं तो एक "कंसोलिडेट" टैब होता है जो सभी पैकेज को एक ही संस्करण में सेट करता है।




यह वास्तव में आपके बाहरी घटक पर निर्भर करता है जब आप किसी बाहरी घटक को किसी .NET अनुप्रयोग में संदर्भ देते हैं, तो उस घटक को पहचानने के लिए GUID उत्पन्न करता है। यह त्रुटि तब होती है, जब आपकी किसी एक प्रोजेक्ट द्वारा संदर्भित बाह्य घटक एक ही नाम पर होता है, लेकिन दूसरे संस्करण के दूसरे संस्करण के रूप में एक अलग संस्करण होता है।

यह कभी-कभी तब होता है जब आप संदर्भों को खोजने के लिए "ब्राउज़ करें" का उपयोग करते हैं और असेंबली के गलत संस्करण को जोड़ते हैं, या आपके पास अपने कोड रिपॉजिटरी में एक घटक का एक अलग संस्करण है जिसे आप स्थानीय मशीन में स्थापित करते हैं।

प्रोजेक्ट्स को इन टकरावों को ढूंढने का प्रयास करें, संदर्भ सूची से घटकों को निकाल दें, फिर उन्हें फिर से सुनिश्चित कर लें कि आप एक ही फ़ाइल की ओर इशारा कर रहे हैं।




मेरे पास यह करने का एक और तरीका है यदि आप अपनी निर्भरताओं को प्रबंधित करने के लिए Nuget का उपयोग कर रहे हैं मुझे पता चला है कि कभी-कभी वीएस और नूगल मैच नहीं करते और नूग यह नहीं पहचान पा रहे हैं कि आपकी परियोजनाएं सिंक्रनाइज़ेशन से बाहर हैं Packages.config एक बात कहेंगे लेकिन सन्दर्भ में दिखाए गए पथ - गुण कुछ और बताएंगे।

यदि आप अपनी निर्भरता को अपडेट करने के लिए तैयार हैं, तो निम्न करें:

  1. समाधान एक्सप्लोरर से, प्रोजेक्ट पर राइट क्लिक करें और 'Nuget Packages प्रबंधित करें' पर क्लिक करें

  2. बाएं फलक में 'इंस्टॉल किए गए पैकेज' टैब का चयन करें अपने इंस्टॉल किए गए संकुल को रिकॉर्ड करें आप अपने packages.config को अपने डेस्कटॉप पर पहली बार प्रतिलिपि बनाना चाहते हैं यदि आपके पास बहुत कुछ है, तो आप यह देख सकते हैं कि क्या नूगेट पीकेजी स्थापित हैं

  3. अपने पैकेज को अनइंस्टॉल करें इसकी ठीक है, हम उन्हें सही वापस जोड़ना चाहते हैं

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

  5. अपने सभी परियोजनाओं के लिए यह करो

  6. समाधान के स्तर पर, एक स्वच्छ और पुनर्निर्माण करें

आप निम्न परियोजनाओं के साथ शुरू करना चाहते हैं और उच्च स्तर वाले लोगों के लिए अपना काम कर सकते हैं, और साथ में चलते हुए प्रत्येक प्रोजेक्ट का पुनर्निर्माण कर सकते हैं।

यदि आप अपनी निर्भरता को अपडेट नहीं करना चाहते हैं, तो आप पैकेज प्रबंधक कंसोल का उपयोग कर सकते हैं, और वाक्य-रचना अपडेट-पैकेज -ProjectName [yourProjectName] [packageName] -वर्सन [संस्करण संख्या] का उपयोग कर सकते हैं




इसके अलावा इस समस्या थी - मेरे मामले में यह सच है कि कई संदर्भों पर सेट "विशिष्ट संस्करण" संपत्ति होने के कारण हुई थी इन संदर्भों पर गलत करने के लिए इस मुद्दे को हल किया।




=> जांचें कि एप्लिकेशन के कुछ उदाहरण आंशिक रूप से इंस्टॉल किए जाएंगे।

=> पहले सभी को अनइंस्टॉल करने के अनुप्रयोग से उस उदाहरण की स्थापना रद्द करें

=> फिर, साफ, पुनर्निर्माण, और तैनात करने का प्रयास करें

इसने मेरी समस्या का हल किया। सादर।




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




  1. "समाधान एक्सप्लोरर" खोलें
  2. "सभी फाइलों को दिखाएँ" पर क्लिक करें
  3. विस्तार "संदर्भ"
  4. आप बाकी की तुलना में थोड़ा अलग आइकन के साथ एक (या अधिक) संदर्भ (ओं) को देखेंगे आमतौर पर, यह पीले रंग का बॉक्स है जिसके बारे में आपको इसका ध्यान रखना है। बस इसे हटा दें
  5. संदर्भ वापस जोड़ें और अपना कोड संकलित करें।
  6. बस इतना ही।

मेरे मामले में, MySQL संदर्भ के साथ एक समस्या थी किसी भी तरह, मैं सभी उपलब्ध संदर्भों की सूची के तहत इसके तीन संस्करणों की सूची कर सकता हूं; .net 2.0, .NET 4.0 और .net 4.5 के लिए मैं ऊपर 1 से 6 प्रक्रिया का पालन किया और यह मेरे लिए काम किया




विचार और जाँच करने के लिए एक अन्य चीज है, सुनिश्चित करें कि आपके पास कोई सेवा नहीं है जो उस बिन फ़ोल्डर का उपयोग कर रहा है। यदि वे सेवा को रोकते हैं और समाधान पुन: निर्मित करते हैं