c# - स्थित असेंबली की स्पष्ट परिभाषा असेंबली संदर्भ से मेल नहीं खाती है




reference compiler-errors (20)

मैं एक सी # विंडोज फॉर्म एप्लिकेशन (विजुअल स्टूडियो 2005) में कुछ यूनिट परीक्षण चलाने की कोशिश कर रहा हूं, और मुझे निम्न त्रुटि मिलती है:

System.IO.FileLoadException: फ़ाइल या असेंबली 'उपयोगिता, संस्करण = 1.2.0.200, संस्कृति = तटस्थ, PublicKeyToken = 764d581291d764f7' या इसकी निर्भरताओं में से एक लोड नहीं हो सका। स्थित असेंबली की स्पष्ट परिभाषा असेंबली संदर्भ से मेल नहीं खाती है। (HRESULT से अपवाद: 0x80131040) **

x.Foo.FooGO () पर

Foo.cs में x.Foo.Foo2 (स्ट्रिंग समूहनाम_) पर: लाइन 123

x.Foo.UnitTests.FooTests.TestFoo () पर FooTests.cs: लाइन 98 **

System.IO.FileLoadException: फ़ाइल या असेंबली 'उपयोगिता, संस्करण = 1.2.0.203, संस्कृति = तटस्थ, PublicKeyToken = 764d581291d764f7' या इसकी निर्भरताओं को लोड नहीं किया जा सका। स्थित असेंबली की स्पष्ट परिभाषा असेंबली संदर्भ से मेल नहीं खाती है। (HRESULT से अपवाद: 0x80131040)

मैं अपने संदर्भों में देखता हूं, और मेरे पास केवल Utility version 1.2.0.203 संदर्भ है (दूसरा एक पुराना है)।

इस डीएलएल फ़ाइल के इस पुराने संस्करण को संदर्भित करने का प्रयास करने का तरीका क्या है, इस पर कोई सुझाव है?

इसके अलावा, मुझे नहीं लगता कि मेरे हार्ड ड्राइव पर भी यह पुरानी असेंबली है। क्या इस पुरानी संस्करण वाली असेंबली को खोजने के लिए कोई उपकरण है?


.NET असेंबली लोडर 1.2.0.203 को खोजने में असमर्थ है, लेकिन 1.2.0.200 मिला। यह असेंबली जो अनुरोध किया गया था उससे मेल नहीं खाता है और इसलिए आपको यह त्रुटि मिलती है। सरल शब्दों में, यह संदर्भित असेंबली नहीं मिल सकता है। सुनिश्चित करें कि यह इसे जीएसी में या एप्लिकेशन पथ में डालकर सही असेंबली पा सकता है। http://blogs.msdn.com/junfeng/archive/2004/03/25/95826.aspx भी देखें।


AssemblyInfo.cs फ़ाइल में आपके असेंबली वर्जन में, * निर्दिष्ट करने के बजाय एक निश्चित संस्करण संख्या का उपयोग करें। * प्रत्येक संकलन पर संस्करण संख्या बदल जाएगा। मेरे मामले में इस अपवाद के लिए यह मुद्दा था।


इस मुद्दे को ठीक करने की मेरी विधि यहां दी गई है।

  1. अपवाद संदेश से, "समस्या" लाइब्रेरी का नाम और "अपेक्षित" संस्करण संख्या प्राप्त करें।

  1. अपने समाधान में उस .dll की सभी प्रतियां पाएं, उन पर राइट-क्लिक करें, और यह जांचें कि .dll का कौन सा संस्करण है।

ठीक है, तो इस उदाहरण में, मेरा .dll निश्चित रूप से 2.0.5022.0 है (इसलिए अपवाद संस्करण संख्या गलत है)।

  1. आपके समाधान में सभी .csproj फ़ाइलों में अपवाद संदेश में दिखाए गए संस्करण संख्या की खोज करें। इस संस्करण संख्या को डीएल से वास्तविक संख्या के साथ बदलें।

तो, इस उदाहरण में, मैं इसे बदल दूंगा ...

<Reference Include="DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />

... इसके साथ...

<Reference Include="DocumentFormat.OpenXml, Version=2.0.5022.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />

काम हो गया !


एक आंतरिक पैकेज भंडार का उपयोग करते समय मैं इस मुद्दे में भाग गया। मैंने आंतरिक भंडार में मुख्य पैकेज जोड़ा था, लेकिन पैकेज की निर्भरता नहीं। सुनिश्चित करें कि आप सभी निर्भरताओं, निर्भरताओं की निर्भरताओं, पुनरावर्ती आदि को अपने आंतरिक भंडार में भी जोड़ दें।


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

अंतिम परिणाम: प्रत्यक्ष संदर्भ (1) और अप्रत्यक्ष संदर्भ (2) क्लाइंट मशीन पर बदले गए डीएल के विभिन्न संस्करणों को इंगित कर रहे थे। मेरी देव मशीन पर यह ठीक काम किया।

समाधान: आवेदन निकालें; एप्लिकेशन फ़ोल्डर से सभी डीएलएलएस हटाएं; पुन: इंस्टॉल करें। मेरे मामले में उतना ही सरल।


निम्नलिखित किसी भी असेंबली संस्करण को संस्करण 3.1.0.0 पर रीडायरेक्ट करता है। हमारे पास एक ऐसी स्क्रिप्ट है जो हमेशा इस संदर्भ को App.config में अपडेट करेगी, इसलिए हमें इस समस्या से फिर से निपटना नहीं होगा।

प्रतिबिंब के माध्यम से आप विधानसभा सार्वजनिक प्राप्त कर सकते हैं और इस ब्लॉक को .dll फ़ाइल से ही उत्पन्न कर सकते हैं।

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
 <dependentAssembly>
    <assemblyIdentity name="Castle.Core" publicKeyToken="407dd0808d44fbdc" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="3.1.0.0" />
  </dependentAssembly>
</assemblyBinding>

ध्यान दें कि एक एक्सएमएल नेमस्पेस विशेषता (xmlns) के बिना यह काम नहीं करेगा।


मुझे एक ही त्रुटि मिली ... मेरे मामले में इसे हल किया गया है:

  • पहले जब एप्लिकेशन इंस्टॉल किया गया था तो यहां लोगों ने एप्लिकेशन में माइक्रोसॉफ्ट एंटरप्राइज़ लाइब्रेरी 4.1 का इस्तेमाल किया था।
  • पिछले हफ्ते मेरी मशीन को स्वरूपित किया गया था और उसके बाद जब मैंने उस एप्लिकेशन को बनाया तो उसने मुझे एक त्रुटि दी कि एंटरप्राइज़ लाइब्रेरी असेंबली गुम है।
  • फिर मैंने माइक्रोसॉफ्ट एंटरप्राइज़ लाइब्रेरी 5.0 स्थापित किया जो मुझे Google पर पहली खोज प्रविष्टि के रूप में मिला।
  • फिर जब मैंने एप्लिकेशन बनाया तो उसने मुझे उपरोक्त त्रुटि दी यानी स्थित असेंबली की मेनिफेस्ट परिभाषा असेंबली संदर्भ से मेल नहीं खाती है।
  • एक खोज कार्य और विश्लेषण के बाद, मैंने पाया कि एप्लिकेशन 4.1.0.0 का संदर्भ दे रहा था और बिन फ़ोल्डर में DLL संस्करण 5.0.0.0 का था
  • मैंने जो किया वह मैंने माइक्रोसॉफ्ट एंटरप्राइज़ लाइब्रेरी 4.1 स्थापित किया था।
  • पिछले संदर्भ को हटा दिया गया (5.0) और 4.0 संदर्भ जोड़ा गया।
  • एप्लिकेशन और वॉयला बनाया ... यह काम किया।

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

कारण प्रकाशक नीति थी । जब मैंने जीएसी से लाइब्रेरी के संस्करणों को अनइंस्टॉल किया, तो मैं प्रकाशक नीति असेंबली को अनइंस्टॉल करना भूल गया, इसलिए स्थानीय रूप से तैनात असेंबली का उपयोग करने के बजाय असेंबली लोडर को जीएसी में प्रकाशक नीति मिली, जिसने इसे एक नए संस्करण की खोज करने के लिए कहा।


मेरे app.config में एक है

<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.11.0"/>

npgsql के लिए। किसी भी तरह उपयोगकर्ता की मशीन पर, मेरा app.exe.config गायब हो गया। मुझे यकीन नहीं है कि यह एक मूर्ख उपयोगकर्ता था, इंस्टॉलर गड़बड़, या अभी तक एंटी-वायरस बाहर wacked। फ़ाइल को प्रतिस्थापित करने से समस्या हल हो गई।


मेरे पास आज भी यही समस्या थी जिसने मुझे एंटिटी फ्रेमवर्क में बदलाव करने के बाद एड-माइग्रेशन करने से रोका।

मेरे समाधान में दो परियोजनाएं थीं, चलिए उन्हें "क्लाइंट" और "डेटा" कहते हैं - एक क्लास लाइब्रेरी प्रोजेक्ट जिसमें मेरे ईएफ मॉडल और संदर्भ थे। क्लाइंट ने डेटा प्रोजेक्ट का संदर्भ दिया।

मैंने दोनों परियोजनाओं पर हस्ताक्षर किए थे, और बाद में ईएफ मॉडल में बदलाव किए। हस्ताक्षर हटा दिए जाने के बाद मैं माइग्रेशन जोड़ सकता था, और फिर परियोजना को फिर से हस्ताक्षर कर सकता था।

मुझे आशा है कि यह किसी के लिए उपयोगी हो सकता है, जिससे उन्हें लंबे समय तक निराशा होती है ..


मेरे मामले में समस्या कुर्सी और कीबोर्ड के बीच थी :-)

Could not load file or assembly 'DotNetOpenAuth.Core, Version=4.0.0.0,
Culture=neutral, PublicKeyToken=2780ccd10d57b246' or one of its dependencies.
The located assembly's manifest definition does not match the assembly reference.
(Exception from HRESULT: 0x80131040)

दो या दो से अधिक अलग असेंबली DotNetOpenAuth लाइब्रेरी के एक अलग संस्करण का उपयोग करना चाहते थे, और यह कोई समस्या नहीं होगी। इसके अलावा, मेरे स्थानीय कंप्यूटर पर एक web.config स्वचालित रूप से NuGet द्वारा अपडेट किया गया था:

<dependentAssembly>
    <assemblyIdentity name="DotNetOpenAuth.AspNet" publicKeyToken="2780ccd10d57b246" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
    </dependentAssembly>
    <dependentAssembly>
        <assemblyIdentity name="DotNetOpenAuth.Core" publicKeyToken="2780ccd10d57b246" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
</dependentAssembly>

तब मुझे एहसास हुआ कि मैं उत्पादन सर्वर पर नए web.config को प्रतिलिपि / तैनात करना भूल गया था। तो यदि आपके पास web.config को तैनात करने का मैन्युअल तरीका है, तो जांचें कि यह अपडेट किया गया है। यदि आपके पास उत्पादन सर्वर के लिए पूरी तरह से web.config है, तो आपको NuGet का उपयोग करने के बाद इन आश्रित Assembly अनुभाग को सिंक में विलय करना होगा।


मेरे मामले में, यह त्रुटि ASP.NET एप्लिकेशन चलाते समय हुई। समाधान था:

  1. प्रोजेक्ट फ़ोल्डर में obj और bin फ़ोल्डर्स को हटाएं

साफ काम नहीं किया, पुनर्निर्माण काम नहीं किया, सभी संदर्भ ठीक थे, लेकिन यह पुस्तकालयों में से एक नहीं लिख रहा था। उन निर्देशिकाओं को हटाने के बाद, सब कुछ पूरी तरह से काम किया।


मैं किसी को अपनी कतरनी मूर्खता से लाभ दूंगा। मेरे पास पूरी तरह से अलग एप्लिकेशन के लिए कुछ निर्भरताएं हैं (चलो इस ऐप 1 को कॉल करें)। उस ऐप 1 से डीएलएल को मेरे नए एप्लिकेशन (ऐप 2) में खींचा जाता है। जब भी मैं APP1 में अपडेट करता हूं, मुझे नया डीएलएल बनाना होगा और उन्हें ऐप 2 में कॉपी करना होगा। कुंआ। । मैं 2 अलग-अलग ऐप 1 संस्करणों के बीच प्रतिलिपि बनाने और चिपकाने से थक गया, इसलिए मैंने बस डीएल के लिए 'NEW_' उपसर्ग जोड़ा।

कुंआ। । । मैं अनुमान लगा रहा हूं कि बिल्ड प्रक्रिया / bin फ़ोल्डर स्कैन करती है और जब यह गलत तरीके से कुछ मेल खाती है, तो यह उपरोक्त जैसा त्रुटि संदेश के साथ बारफ करता है। मैंने अपने "new_" संस्करणों को हटा दिया और यह सिर्फ बेवकूफ बनाया गया।


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


मैं सिर्फ यह जोड़ना चाहता हूं कि मैं मूल एएसपी.नेट एमवीसी 4 प्रोजेक्ट बना रहा था और NuGet के माध्यम से DotNetOpenAuth.AspNet जोड़ा। माइक्रोसॉफ्ट.Web.WebPages.OAuth के लिए एक विसंगति डीएलएल फ़ाइल का संदर्भ देने के बाद इसके परिणामस्वरूप एक ही त्रुटि हुई।

इसे ठीक करने के लिए मैंने एक Update-Package और पूर्ण पुनर्निर्माण के लिए समाधान साफ़ किया।

यह मेरे लिए काम करता है और एक आलसी तरीका है, लेकिन समय पैसा है :- पी


मैंने एक NuGet पैकेज जोड़ा, केवल मेरे एप्लिकेशन का ब्लैक-बॉक्स भाग लाइब्रेरी के पुराने संस्करण का संदर्भ दे रहा था।

मैंने पैकेज को हटा दिया और पुराने संस्करण की स्थिर DLL फ़ाइल का संदर्भ दिया, लेकिन web.config फ़ाइल को कभी भी अपडेट नहीं किया गया था:

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

जब मैंने पैकेज को अनइंस्टॉल किया था तो उसे वापस क्या करना चाहिए था:

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

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

त्रुटि को हल करने के लिए आपको सही सार्वजनिक कुंजी टोकन (आप इसे डीएल पर स्न-टी का उपयोग करके प्राप्त कर सकते हैं) जोड़ना होगा। उम्मीद है की यह मदद करेगा।


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


यह तब भी हो सकता है जब आप Assembly विधानसभा टैग के साथ AssemblyInfo.cs दोनों का उपयोग कर रहे हैं और आपकी .csproj फ़ाइल के पास एक अलग मान है। असेंबलीइन्फो से मेल खाते हुए या अनुभाग को सभी को एक साथ हटाकर समस्या दूर हो जाती है।


समाधान को साफ और पुनर्निर्माण आउटपुट निर्देशिका से सभी डीएलएल को प्रतिस्थापित नहीं कर सकता है।

मैं सुझाव दूंगा कि "bin" से "oldbin" या "obj" से "oldobj" में फ़ोल्डर का नाम बदलने का प्रयास करें

और फिर अपने चुप्पी को फिर से बनाने का प्रयास करें।

अगर आप किसी तीसरे पक्ष के डीएल का उपयोग कर रहे हैं तो उन्हें सफल बनाने के बाद नए बनाए गए "बिन" या "ओबीजे" फ़ोल्डर में कॉपी करने की आवश्यकता होगी।

उम्मीद है कि यह आपके लिए काम करेगा।





version