سؤال

أحاول إجراء بعض اختبارات الوحدات في تطبيق C# Windows Forms (Visual Studio 2005)، وأحصل على الخطأ التالي:

System.IO.FileLoadException:تعذر تحميل الملف أو التجميع "الأداة المساعدة، الإصدار=1.2.0.200، الثقافة=محايدة، PublicKeyToken=764d581291d764f7" أو أحد تبعياتها.لا يتطابق تعريف بيان التجميع الموجود مع مرجع التجميع.(استثناء من HRESULT:0x80131040)**

في x.Foo.FooGO()

في x.Foo.Foo2(String groupName_) في Foo.cs: السطر 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 (والآخر قديم).

هل هناك أي اقتراحات حول كيفية معرفة ما الذي يحاول الإشارة إلى هذا الإصدار القديم من ملف DLL هذا؟

بالإضافة إلى ذلك، لا أعتقد أن لدي هذا التجميع القديم على القرص الصلب الخاص بي.هل هناك أي أداة للبحث عن هذا التجميع ذو الإصدار القديم؟

هل كانت مفيدة؟

المحلول

والمحمل الجمعية .NET غير قادر على إيجاد 1.2.0.203، ولكن لم تجد 1.2.0.200. لا يتطابق هذا التجمع ما طلب، وبالتالي تحصل على هذا الخطأ. في كلمات بسيطة، فإنه لا يمكن العثور على التجميع التي تم الرجوع إليها. تأكد من أنه يمكن العثور على التجميع الصحيح من خلال وضعه في GAC أو في مسار التطبيق. انظر أيضا http://blogs.msdn.com/junfeng/archive /2004/03/25/95826.aspx .

نصائح أخرى

ويمكنك القيام بضعة أشياء لاستكشاف هذه المشكلة. أولا، استخدم بحث ملف ويندوز للبحث محرك القرص الثابت لالتجميع الخاص بك (. DLL). وبمجرد الانتهاء من قائمة النتائج، القيام عرض-> اختر التفاصيل ... ومن ثم تحقق "إصدار ملف". وهذا عرض رقم الإصدار في قائمة النتائج، لذلك يمكنك أن ترى فيها النسخة القديمة قد تكون قادمة من.

وأيضا، مثل وقال لارس، تحقق GAC لمعرفة ما هو إصدار موجود في القائمة. هذه المقالة مايكروسوفت تنص على أن التجمعات وجدت في GAC لا يتم نسخ محليا خلال بناء، لذلك قد تحتاج إلى إزالة الإصدار القديم قبل القيام إعادة بناء كل شيء. (انظر جوابي على هذا السؤال للحصول على الملاحظات على إنشاء ملف دفعي للقيام هذا بالنسبة لك)

إذا كنت لا تزال لا يمكن معرفة من أين النسخة القديمة قادمة من، يمكنك استخدام التطبيق fuslogvw.exe الذي يأتي مع Visual Studio للحصول على مزيد من المعلومات حول فشل ملزمة. مايكروسوفت لديها المعلومات حول هذه الأداة هنا . لاحظ أنه سيكون لديك لتمكين تسجيل عن طريق تعيين مفتاح التسجيل HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\EnableLog إلى 1.

وركضت للتو في هذه المشكلة بنفسي، ولقد وجدت أن المسألة شيئا مختلفا عما قد تشغيل غيرهم في.

وكان لي اثنين من دلس هذا المشروع الرئيسي بلدي والرجوع: CompanyClasses.dll وCompanyControls.dll. الأول هو الحصول على خطأ وقت التشغيل قائلا:

<اقتباس فقرة>   

وتعذر تحميل الملف أو التجميع   "CompanyClasses، الإصدار = 1.4.1.0،   الثقافة = محايدة،   PublicKeyToken = 045746ba8544160c "أو   أحد تبعياته. وتقع   تعريف واضح الجمعية لا   لا تتطابق مع مرجع تجميع

وكانت المشكلة، لم يكن لدي أي ملفات CompanyClasses.dll على نظام بلدي مع رقم إصدار 1.4.1. لا شيء في GAC، لا شيء في المجلدات التطبيق ... لا شيء في أي مكان. لقد بحثت بلدي القرص الصلب بأكمله. وكانت جميع الملفات CompanyClasses.dll كان لي 1.4.2.

والمشكلة الحقيقية، وجدت، وكان أن CompanyControls.dll المشار النسخة 1.4.1 من CompanyClasses.dll. أنا فقط معاد CompanyControls.dll (بعد وجود لها مرجع CompanyClasses.dll 1.4.2) وذهب هذا الخطأ بعيدا بالنسبة لي.

وفيما يلي الموجهات أي إصدار التجميع إلى الإصدار 3.1.0.0. لدينا السيناريو الذي دائما سيتم تحديث هذا المرجع في App.config لذلك نحن لن تضطر إلى التعامل مع هذه القضية مرة أخرى.

وخلال انعكاس يمكنك الحصول على التجمع publicKeyToken وتوليد هذه الكتلة من ملف .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>

ملاحظة أنه من دون سمة مساحة الاسم XML (XMLNS) هذا لن ينجح.

إذا كنت تستخدم Visual Studio، محاولة "حل نظيفة"، ومن ثم إعادة بناء المشروع.

وقال إن إجابات أخرى لا تعمل بالنسبة لي. إذا كنت لا تهتم حول إصدار وتريد فقط التطبيق الخاص بك لتشغيل ثم انقر على الحق في إشارة ومجموعة 'إصدار محدد "إلى false ... وهذا عمل بالنسبة لي.

وجريت عبر هذه المسألة، وكان مشكلة لدي نسخة قديمة من في .dll في بلدي دليل التطبيق التصحيح. قد ترغب في التحقق أيضا هناك (بدلا من GAC) لمعرفة ما إذا كنت ترى ذلك.

وأضفت حزمة 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>

في حالتي، حدث هذا الخطأ أثناء تشغيل تطبيق ASP.NET.وكان الحل هو:

  1. حذف obj و bin المجلدات في مجلد المشروع

لم ينجح التنظيف، ولم ينجح إعادة البناء، وكانت جميع المراجع جيدة، لكنها لم تكن تكتب إحدى المكتبات.بعد حذف تلك الدلائل، كل شيء يعمل بشكل مثالي.

في حالتي كان نسخة قديمة من DLL في C: \ WINDOWS \ Microsoft.NET \ الإطار \ ~ \ المؤقتة ASP.NET الملفات \ الدليل. يمكنك إما حذف أو استبدال النسخة القديمة، أو يمكنك إزالة وإضافة مرة أخرى الإشارة إلى DLL في المشروع. في الأساس، إما شكل من الأشكال مؤشر جديد لملفات ASP.NET مؤقت.

وانا ذاهب لتفجير أذهان الجميع في الوقت الحالي. . .

وحذف كافة المراجع <assemblyBinding> من ملف .config الخاص بك، ثم قم بتشغيل هذا الأمر من وحدة تحكم إدارة NuGet الحزمة:

Get-Project -All | Add-BindingRedirect

وبالنسبة لنا، كان السبب في المشكلة شيء آخر. وتضمن ملف الترخيص لمكونات DevExpress خطين، واحد للنسخة قديمة من المكونات التي لم يتم تثبيت على هذا الكمبيوتر معين. إزالة الإصدار الأقدم من ملف الترخيص حل القضية.

والجزء مزعج هو أن رسالة الخطأ لم يشر إلى ما إشارة كان يسبب المشاكل.

ويتم طرح هذا الخطأ نفسه بالضبط إذا حاولت أواخر ربط باستخدام الانعكاس، إذا كان التجمع كنت ملزمة ليحصل قوي اسمه أو لديه رمز لها مفتاح عمومي يتغير. الخطأ هو نفسه على الرغم من أنه لا يوجد في الواقع أي تجمع وجدت مع رمز المفتاح العمومي المحدد.

وتحتاج إلى إضافة الصحيح رمز المفتاح العمومي (يمكنك الحصول عليه باستخدام SN -T على دلل) لحل الخطأ. ويساعد هذا الأمل.

وكان منجم وضع مشابه جدا لهذا المنصب من قبل ناثان بدفورد ولكن مع تطور طفيف. مشروعي الإشارة أيضا دلل تغير بطريقتين. 1) مباشرة و2) بشكل غير مباشر عن طريق الرجوع إلى العنصر (مكتبة فئة) الذي كان في حد ذاته إشارة إلى دلل تغير. الآن مشروعي برنامج Visual Studio للمكون (2) المشار إليها الإصدار الصحيح من دلل تغير. ولكن رقم إصدار compnent نفسه لم يتغير. ونتيجة لذلك تثبيت النسخة الجديدة من مشروع فاشل لاستبدال هذا المكون على جهاز العميل.

والنتيجة النهائية: المرجعية المباشرة (1) والإشارة غير المباشرة (2) ولافتا إلى إصدارات مختلفة من دلل تغير في جهاز العميل. على آلة ديف لي انها عملت بشكل جيد.

والدقة: إزالة التطبيق؛ حذف جميع ملفات DLL من مجلد التطبيق. إعادة install.Simple كما أنه في حالتي.

وأنا سأترك فائدة شخص من بلدي الغباء القص. لدي بعض تبعيات إلى تطبيق منفصل تماما (دعونا نسمي هذا APP1). يتم سحب ال DLL من أن APP1 في بلدي التطبيق الجديد (APP2). أي وقت أفعل التحديثات في APP1، لا بد لي من إنشاء دلل الجديد ونسخها إلى APP2. حسنا. . حصلت. أنا تعبت من النسخ واللصق بين 2 إصدارات مختلفة APP1، ولذا فإنني ببساطة بإضافة البادئة "NEW_" إلى ال DLL.

وحسنا. . . انا التخمين أن عملية الإنشاء بمسح مجلد / بن وعندما يطابق شيء ما غير صحيح، فإنه barfs مع نفس رسالة الخطأ كما ذكر أعلاه. أنا حذف بلدي إصدارات "new_"، وبنيت فقط من الطراز الأول.

وقضية بلدي ونسخ الكود المصدري لجهاز جديد من دون سحب على أي من المجالس المشار إليه.

لا شيء أنني لم الثابتة الخطأ، لذلك على عجل، وأنا حذف الدليل BIN تماما. إعادة بناء التعليمات البرمجية المصدر الخاص بي، وعملت منذ ذلك الحين على الخروج.

وأود أن أضيف فقط أن كنت خلق الأساسي مشروع ASP.NET MVC 4، وأضاف DotNetOpenAuth.AspNet عبر NuGet. وأدى ذلك إلى نفس الخطأ بعد أن المشار ملف DLL غير متطابقة لMicrosoft.Web.WebPages.OAuth.

لإصلاحه فعلت Update-Package وتنظيفها الحل لكامل إعادة البناء.

والتي عملت بالنسبة لي وهو نوع من الطريقة البطيئة، ولكن الوقت هو المال :-P

وحصلت على هذا الخطأ أثناء بناء على الخدمة بناء فريق مؤسسة خادم ل. واتضح كان لي عدة مشاريع في بلدي الحل باستخدام إصدارات مختلفة من نفس المكتبة واضاف مع NuGet. أنا إزالة جميع الإصدارات القديمة مع NuGet وأضاف واحدة جديدة كمرجع للجميع.

وفريق مؤسسة خادم يضع كل ملفات DLL في دليل واحد، ويمكن أن يكون هناك سوى ملف DLL واحد من اسم معين في وقت بطبيعة الحال.

وبلدي app.config يحتوي على

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

ولnpgsql. بطريقة أو بأخرى على الجهاز المستخدم، وذهب بي app.exe.config المفقود. ولست متأكدا إذا كان المستخدم سخيفة، المثبت خلل، أو wacked من مكافحة الفيروسات حتى الان. استبدال ملف حل هذه القضية.

وأنا فقط وجدت سبب آخر للحصول على هذا الخطأ. أنا تنظيف بلدي GAC من كافة إصدارات مكتبة محددة وبنيت مشروعي مع الإشارة إلى إصدار معين نشر جنبا إلى جنب مع تنفيذ. عند تشغيل المشروع حصلت على هذا الاستثناء تبحث عن إصدار أحدث من المكتبة.

وكان السبب الناشر سياسة . عندما كنت إلغاء تثبيت إصدارات المكتبة من GAC لقد نسيت لإلغاء المجالس سياسة الناشر وكذلك لذلك بدلا من استخدام بلدي المنتشرة محليا التجمع محمل التجمع وجدت سياسة الناشر في GAC التي قال انها للبحث عن إصدار أحدث.

للي تكوين مدونة التغطية في ملف "Local.testtesttings" "تسبب" المشكلة. لقد نسيت لتحديث الملفات التي تم الرجوع إليها هناك.

وفقط حذف محتويات مجلد بن مشروعك وإعادة بناء الحل حل مشكلتي.

ونظيفة وإعادة بناء الحل قد لا تحل محل كل عام دلل من الدليل الإخراج.

ما أنا أقترح هو محاولة إعادة تسمية المجلد من "بن" إلى "oldbin" أو "الكائنات" إلى "oldobj"

وثم محاولة بناء silution مرة أخرى.

وطارئ إذا كنت تستخدم أي دلل طرف ثالث تلك التي سوف تحتاج إلى نسخ إلى أنشئت حديثا "بن" أو مجلد "الكائنات" بعد بناء ناجحة.

ونأمل أن يكون هذا سوف تعمل من أجلك.

وحذف يدويا التجمع القديم من موقع المجلد ثم إضافة الإشارة إلى التجمعات الجديدة قد تساعد.

تلقيت نفس الخطأ...في حالتي تم حلها على النحو التالي:

  • في البداية، عندما تم تثبيت التطبيق، استخدم الأشخاص هنا Microsoft Enterprise Library 4.1 في التطبيق.
  • في الأسبوع السابق، تمت تهيئة جهازي، وبعد ذلك اليوم، عندما قمت بإنشاء هذا التطبيق، أعطاني خطأ مفاده أن مجموعة مكتبة المؤسسة مفقودة.
  • ثم قمت بتثبيت Microsoft Enterprise Library 5.0 والذي حصلت عليه على Google كأول إدخال للبحث.
  • ثم عندما قمت بإنشاء التطبيق أعطاني الخطأ أعلاه، أي:لا يتطابق تعريف بيان التجميع الموجود مع مرجع التجميع.
  • بعد الكثير من البحث والتحليل، وجدت أن التطبيق كان يشير إلى 4.1.0.0 وأن ملف DLL الموجود في مجلد bin كان من الإصدار 5.0.0.0
  • ما فعلته هو أنني قمت بتثبيت Microsoft Enterprise Library 4.1.
  • تمت إزالة المرجع السابق (5.0) وإضافة المرجع 4.0.
  • قمت ببناء التطبيق وهاهو قد نجح.

ها هي طريقتي لإصلاح هذه المشكلة.

  1. من رسالة الاستثناء، احصل على اسم مكتبة "المشكلة" ورقم الإصدار "المتوقع".

enter image description here

  1. يجد جميع النسخ من ملف .dll هذا في الحل الخاص بك، انقر بزر الماوس الأيمن عليه، وتحقق من إصدار .dll الموجود.

enter image description here

حسنًا، في هذا المثال، ملف .dll الخاص بي هو بالتأكيد 2.0.5022.0 (وبالتالي فإن رقم إصدار الاستثناء خاطئ).

  1. ابحث عن رقم الإصدار الذي ظهر في رسالة الاستثناء في كافة .csproj الملفات في الحل الخاص بك.استبدل رقم الإصدار هذا بالرقم الفعلي من ملف dll.

لذا، في هذا المثال، سأستبدل هذا ...

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

تم إنجاز المهمة !

في حالتي كانت المشكلة بين الكرسي ولوحة المفاتيح: -)

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 مختلفة تماما عن خادم الإنتاج، لديك لدمج هذه القسم dependentAssembly متزامنة بعد استخدام NuGet.

إذا حصلت على خطأ مثل "لا يتطابق تعريف بيان التجميع الموجود مع مرجع التجميع"وإذا قمت بالتحديث عبر المشروع> إدارة حزم NuGet وعلامة التبويب تحديث في VS, ، أول شيء يمكنك فعله هو محاولة تثبيت إصدار آخر من الحزمة بعد التحقق من الإصدارات من صفحة معرض NuGet وتشغيل الأمر التالي من وحدة تحكم إدارة الحزم:

PM> Install-Package YourPackageName -Version YourVersionNumber 
//Example
PM> Install-Package Microsoft.Extensions.FileProviders.Physical -Version 2.1.0

على الرغم من أن الإجابة لا ترتبط مباشرة بالحزمة المعنية وقد تم طرحها منذ فترة طويلة، إلا أنها عامة نوعًا ما، ولا تزال ذات صلة ونأمل أن تساعد شخصًا ما.

وصلتني رسالة الخطأ هذه بسبب الرجوع إلى الجمعية التي لديها نفس اسم التجمع كنت بناء.

وهذا جمع لكنها overwrote التجميع المشار إليه مع المشاريع الحالية التجمع - مما تسبب في الخطأ

لإصلاحه لقد غيرت اسم المشروع، وخصائص التجمع المتاحة من خلال النقر بزر الماوس الأيمن على المشروع واختيار 'خصائص'.

في AssemblyVersion الخاص بك في الملف AssemblyInfo.cs، استخدم رقم الإصدار ثابت بدلا من تحديد *. سوف * تغيير رقم الإصدار على كل مجموعة. وكانت تلك القضية لهذا الاستثناء في حالتي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top