تحذير:تم العثور على تعارضات بين إصدارات مختلفة من نفس التجميع التابع

StackOverflow https://stackoverflow.com/questions/17806

  •  09-06-2019
  •  | 
  •  

سؤال

أقوم حاليًا بتطوير تطبيق .NET، والذي يتكون من 20 مشروعًا.تم تجميع بعض هذه المشاريع باستخدام .NET 3.5، والبعض الآخر لا يزال مشاريع .NET 2.0 (حتى الآن لا توجد مشكلة).

المشكلة هي أنني إذا قمت بتضمين مكون خارجي، فإنني أتلقى دائمًا التحذير التالي:

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

ماذا يعني هذا التحذير بالضبط وهل هناك إمكانية لاستبعاد هذا التحذير (مثل استخدام #pragma Disable في ملفات التعليمات البرمجية المصدر)؟

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

المحلول

يعني هذا التحذير أن مشروعين يشيران إلى نفس التجميع (على سبيل المثال. System.Windows.Forms) لكن المشروعين يتطلبان إصدارات مختلفة.لديك بعض الخيارات:

  1. إعادة ترجمة كافة المشاريع لاستخدام نفس الإصدارات (على سبيل المثال.انقل الكل إلى .Net 3.5).هذا هو الخيار المفضل لأن كافة التعليمات البرمجية تعمل مع إصدارات التبعيات التي تم تجميعها معها.

  2. أضف إعادة توجيه ملزمة.سيؤدي هذا إلى منع التحذير.ومع ذلك، سيتم ربط مشاريع .Net 2.0 الخاصة بك (في وقت التشغيل) بإصدارات .Net 3.5 للتجميعات التابعة مثل System.Windows.Forms.يمكنك إضافة إعادة توجيه ربط بسرعة عن طريق النقر المزدوج على الخطأ في Visual Studio.

  3. يستخدم CopyLocal=true.لست متأكدًا مما إذا كان هذا سيؤدي إلى منع التحذير.سيعني ذلك، مثل الخيار 2 أعلاه، أن جميع المشاريع ستستخدم الإصدار .Net 3.5 من System.Windows.Forms.

فيما يلي طريقتان لتحديد المرجع (المراجع) المخالف:

  • يمكنك استخدام أداة مساعدة مثل تلك الموجودة فيhttps://Gist.github.com/1553265
  • هناك طريقة أخرى بسيطة تتمثل في ضبط فعل إخراج البناء (الأدوات والخيارات والمشاريع والحلول ، والبناء والتشغيل ، وعملية الإخراج MSBUILD ، والتفصيل) وبعد البناء ، ابحث في نافذة الإخراج للتحذير ، وإلقاء نظرة على النص فوقه مباشرةً . (نصيحة القبعة ل باولويا الذي اقترح هذا في التعليقات على هذه الإجابة).

نصائح أخرى

يحدث هذا بشكل أساسي عندما يتم تعيين "نسخ محلي" على "صحيح" للتجميعات التي تشير إليها، مما يعني أنه يتم وضع نسخة من ملف DLL في مجلد السلة مع ملف exe الخاص بك.

نظرًا لأن Visual Studio سيقوم بنسخ كافة تبعيات التجميع المشار إليه أيضًا، فمن الممكن أن ينتهي الأمر ببنيتين مختلفتين من نفس التجميع المشار إليه.من المرجح أن يحدث هذا إذا كانت مشاريعك في حلول منفصلة، ​​وبالتالي يمكن تجميعها بشكل منفصل.

الطريقة التي تعاملت بها هي تعيين Copy Local إلى False للمراجع في مشاريع التجميع.افعل ذلك فقط مع الملفات التنفيذية/تطبيقات الويب حيث تحتاج إلى التجميع لتشغيل المنتج النهائي.

نأمل أن يكون ذلك منطقيا!

كنت أرغب في نشر حل pauloya الذي قدموه في التعليقات أعلاه.أعتقد أن هذا هو الحل الأفضل للعثور على المراجع المخالفة.

إن أبسط طريقة للعثور على ما هي "مرجع (مرجع) مهمتين هي تعيين فعل إخراج البناء (الأدوات والخيارات والمشاريع والحلول ، والبناء والتشغيل ، وتصرف الإخراج MSBUILD ، والتفصيل) وبعد البناء ، ابحث في نافذة الإخراج للتحذير.انظر النص فوقه.

على سبيل المثال، عند البحث في لوحة الإخراج عن "الصراع" قد تجد شيئًا مثل هذا:

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 من EF.

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

في النهاية اتضح أن المشكلة كانت عبارة عن تبعية متداخلة لأحد المراجع التي كانت لدي في مشروع واحد.يتطلب هذا المرجع (أ) بدوره إصدارًا مختلفًا من (ب) والذي تمت الإشارة إليه مباشرة من جميع المشاريع الأخرى في الحل الخاص بي.تحديث المرجع في المشروع المشار إليه حلها.

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)

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

في Visual Studio إذا نقرت بزر الماوس الأيمن على حل و إدارة حزم nuget هناك "توطيد" علامة التبويب التي تحدد كافة الحزم على نفس الإصدار.

لقد تلقيت للتو رسالة التحذير هذه وقمت بتنظيف الحل وإعادة ترجمته (Build -> Clean Solution) واختفى.

واجهت نفس المشكلة وتم حلها عن طريق تغيير ما يلي في web.config.

لقد حدث ذلك لي لأنني أقوم بتشغيل التطبيق باستخدام 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 لإدارة تبعياتك.لقد اكتشفت أنه في بعض الأحيان لا يتطابق VS وNuget وأن Nuget غير قادر على إدراك أن مشاريعك غير متزامنة.سيقول packages.config شيئًا واحدًا ولكن المسار الموضح في المراجع - الخصائص سيشير إلى شيء آخر.

إذا كنت ترغب في تحديث تبعياتك، فقم بما يلي:

  1. من Solution Explorer ، انقر بزر الماوس الأيمن فوق المشروع وانقر فوق "إدارة حزم nuget"

  2. حدد علامة التبويب "تثبيت الحزم" في الجزء الأيسر ، سجل الحزم المثبتة قد ترغب في نسخ الحزم الخاصة بك.

  3. قم بإلغاء تثبيت الحزم الخاصة بك.لا بأس، سنقوم بإضافتهم مرة أخرى.

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

  5. افعل ذلك لجميع مشاريعك.

  6. على مستوى الحل، قم بإجراء التنظيف وإعادة البناء.

قد ترغب في البدء بالمشاريع الأقل ثم الانتقال إلى المشاريع ذات المستوى الأعلى، وإعادة بناء كل مشروع مع تقدمك.

إذا كنت لا ترغب في تحديث تبعياتك، فيمكنك استخدام وحدة تحكم مدير الحزم واستخدام بناء الجملة Update-Package -ProjectName [yourProjectName] [packageName] -Version [versionNumber]

=> تحقق من أنه سيكون هناك بعض مثيلات التطبيق المثبتة جزئيًا.

=> أولاً قم بإلغاء تثبيت هذا المثيل من تطبيق إلغاء التثبيت.

=> ثم نظف وأعد البناء وحاول النشر.

هذا حل مشكلتي. آمل أن يساعدك أيضًا.أطيب التحيات.

واجهت هذه المشكلة أيضًا - في حالتي كان السبب هو تعيين خاصية "إصدار محدد" على عدد من المراجع على "صحيح".يؤدي تغيير هذا إلى خطأ في تلك المراجع إلى حل المشكلة.

هذا ما حدث لي أيضا.تمت الإشارة إلى ملف dll واحد مرتين:مرة واحدة مباشرة (في المراجع) ومرة ​​بشكل غير مباشر (المشار إليها في مشروع مرجعي آخر).لقد قمت بإزالة المرجع المباشر والحل المنظف وإعادة البناء.مشكلة ثابتة.

  1. افتح "مستكشف الحلول".
  2. انقر على "إظهار كافة الملفات"
  3. قم بتوسيع "المراجع"
  4. ستشاهد مرجعًا (أو أكثر) برمز مختلف قليلًا عن الباقي.عادةً ما يكون ذلك مع مربع أصفر يقترح عليك تدوين ملاحظة عنه.فقط قم بإزالته.
  5. أضف المرجع مرة أخرى وقم بتجميع التعليمات البرمجية الخاصة بك.
  6. هذا كل شئ.

في حالتي، كانت هناك مشكلة في مرجع MySQL.وبطريقة ما، يمكنني إدراج ثلاثة إصدارات منه ضمن قائمة جميع المراجع المتاحة؛لـ.net 2.0 و.net 4.0 و.net 4.5.لقد اتبعت العملية من 1 إلى 6 أعلاه وقد نجحت معي.

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

يبدو أن هناك مشكلة في Mac Visual Studio عند تحرير ملفات .resx.لا أعرف حقًا ما الذي حدث، ولكن واجهت هذه المشكلة بمجرد قيامي بتحرير بعض ملفات .resx على جهاز Mac الخاص بي.لقد فتحت المشروع على نظام Windows، وفتحت الملفات وكانت كما لو أنها لم يتم تحريرها.لذلك قمت بتحريرها وحفظها، وبدأ كل شيء في العمل مرة أخرى على نظام Mac أيضًا.

لقد واجهت مثل هذه المشكلة عندما كان مشروعي يشير إلى NETStandardLibrary وتم نشر إحدى التجميعات المرجعية لـ netcore.لقد قمت بنشره للتو على أنه netstandard وانتهت المشكلة

إذا كنت تستخدم NuGet، فكل ما كان علي فعله هو:

  1. انقر بزر الماوس الأيمن فوق المشروع وانقر فوق إدارة حزم NuGet..

  2. انقر فوق الترس في أعلى اليمين

  3. انقر فوق علامة التبويب عام في NuGet Package Manager أعلى مصادر الحزم

  4. حدد "تخطي تطبيق عمليات إعادة التوجيه الملزمة" في عمليات إعادة التوجيه الملزمة

  5. تنظيف وإعادة بناء وذهب التحذير

سهل جدا

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