.net - حل MSB3247-العثور على تعارضات بين إصدارات مختلفة من نفس التجمع التابعة




msbuild clr (9)

استخدم قارئ التبعية

باستخدام dep.exe يمكنك سرد جميع الاعتمادات المتداخلة للمجلد بأكمله. جنبا إلى جنب مع أدوات unix مثل grep أو awk ، يمكن أن تساعدك على حل مشكلتك

العثور على التجميعات المشار إليها في أكثر من إصدار واحد

$ dep | awk '{ print $1 " " $2; print $4 " " $5 }' | awk '{ if (length(versions[$1]) == 0) versions[$1] = $2; if (versions[$1] != $2) errors[$1] = $1; }  END{ for(e in errors) print e } ' 
System.Web.Http            

هذا سطر الأوامر غامض يدير dep.exe ثم أنابيب الإخراج مرتين إلى awk إلى

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

فهم كيف سحبت هذا التجميع في بن الخاص بك

$ dep myproject/bin | grep -i System\.Web\.Http
MyProject-1.0.0.0 >> System.Web.Http.Web-5.2.3.0 2 ( FooLib-1.0.0.0 )
MyProject-1.0.0.0 >> System.Web.Http.Web-4.0.0.0 2 ( BarLib-1.0.0.0 )
FooLib-1.0.0.0 > System.Web.Http.Web-5.2.3.0 1
BarLib-1.0.0.0 > System.Web.Http.Web-4.0.0.0 1 

في هذا المثال ، ستظهر الأداة أن System.Web.Http 5.2.3 يأتي من التبعية إلى FooLib بينما يأتي الإصدار 4.0.0 من BarLib.

ثم لديك الاختيار بين

  • إقناع أصحاب الليبس لاستخدام نفس الإصدار
  • التوقف عن استخدام واحد منهم
  • إضافة عمليات إعادة توجيه الربط في ملف التهيئة الخاص بك لاستخدام أحدث إصدار

كيفية تشغيل هذه الأشياء في ويندوز

إذا لم يكن لديك نوع من نوع unix shell ، فستحتاج إلى تنزيله قبل أن تتمكن من تشغيل awk و grep . حاول واحد من التالي

انتهى حل .NET 3.5 مع هذا التحذير عند التحويل البرمجي مع msbuild.

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

لقد جربت استخدام MSBUILD من VS 2010 Beta 2 (حيث أشارت مقالة Connect إلى أن هذا تم إصلاحه في الإصدار التالي من CLR) ، لكن ذلك لم يقدم أي تفاصيل إضافية (ربما تكون النسخة الثابتة بيتا 2)

هل هناك نهج أفضل (أكثر آلية)؟


أبسط طريقة دون أن تأخذ في الاعتبار الاعتبارات (الداخلية):

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

في حالتي ، كان هناك مشكلة مع مرجع MySQL. بطريقة ما ، يمكنني سرد ​​ثلاثة إصدارات منه تحت قائمة جميع المراجع المتاحة. تابعت العملية من 1 إلى 6 أعلاه وعملت لي.


تغيير "مشروع بناء مشروع MSBuild فائض" إلى "مفصلة" أو أعلاه. لكي تفعل هذا، اتبع هذه الخطوات:

  1. أظهر مربع حوار الخيارات ( أدوات -> خيارات ... ).
  2. في الشجرة اليسرى ، حدد عقدة Projects and Solutions ، ثم حدد Build and Run .
    • ملاحظة: إذا لم تظهر هذه العقدة ، فتأكد من تحديد مربع الاختيار في الجزء السفلي من مربع الحوار عرض جميع الإعدادات .
  3. في صفحة الأدوات / الخيارات التي تظهر ، قم بتعيين مستوى فاءدة مشروع إنشاء مشروع MSBuild إلى الإعداد المناسب بناءً على إصدارك:

    • عندما يكون التشخيص على VS2012 أو VS2013 أو VS2015 (تقول الرسالة في هذه الإصدارات يجب عليك استخدام "مفصل" ، ولكن هذا خطأ بسيط ، يجب عليك استخدام "التشخيص" )
    • مفصل عندما تكون في VS2010
    • عادي سوف يكفي في VS2008 أو أكبر.
  4. بناء المشروع والبحث في نافذة الإخراج.

تحقق من رسائل MSBuild. يجب أن ResolveAssemblyReferences مهمة ResolveAssemblyReferences ، والتي هي المهمة التي تنشأ منها MSB3247 ، في تصحيح هذه المشكلة بالتحديد.

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

Target ResolveAssemblyReferences:
    Consider app.config remapping of assembly "System.Data.SqlServerCe, ..." 
        from Version "3.5.1.0" [H:\...\Debug\System.Data.SqlServerCe.dll] 
        to Version "9.0.242.0" [C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PublicAssemblies\System.Data.SqlServerCe.dll]
        to solve conflict and get rid of warning.
    C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets : 
        warning MSB3247: Found conflicts between different versions of the same dependent assembly.

ليس لديك لفتح كل التجميع لتحديد إصدارات التجميعات المشار إليها.

  • يمكنك التحقق من خصائص كل مرجع.
  • افتح خصائص المشروع وتحقق من إصدارات قسم "المراجع".
  • افتح المشاريع باستخدام محرر النصوص.
  • استخدام. صافي العاكس.

في وقت ما الإجابةAMissico لا يكفي. في حالتي ، لم أتمكن من العثور على الخطأ في النوافذ Output لذا قررت إنشاء ملف سجل وتحليله ، عن طريق القيام بالخطوات التالية:

  1. حفظ سجل البناء إلى ملف ... https://msdn.microsoft.com/en-us/library/ms171470.aspx

    msbuild MyProject.proj /fl /flp:logfile=MyProjectOutput.log;verbosity=detailed

  2. أوجد النص: warning MS... أو معلومات التحذير المحددة: (على سبيل المثال سطر 9293) Found conflicts between different versions... والتفاصيل الكاملة لخطأ التعارض سيكون فوق هذه الرسالة (على سبيل المثال سطر 9277) There was a conflicts between...

Visual Studio 2013


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

كانت المشكلة في الواقع مستقيمة تماما على الرغم من العثور على الجاني.

الخلفية: قمت بترقية مشروعي من VS2008 إلى VS2010. في VS2008 كان الإطار المستهدف 3.5 وعندما أحضرته إلى VS2010 قمت بتحويله إلى 4 (كامل). قمت أيضًا بترقية بعض مكونات الطرف الثالث بما في ذلك تقارير Crystal.

وقد تبين أن معظم المراجع في النظام تشير إلى الإصدار 4.0.0.0 ولكن لم يتغير الزوجان تلقائيًا (النظام و System.Web.Services) ولا يزالان ينظران إلى 2.0.0.0. تقارير Crystal تشير إلى 4.0.0.0 ولذلك كان هذا هو المكان الذي تحدث فيه التعارضات. ببساطة وضع المؤشر في أول مكتبة النظام في مستكشف الحلول ، المؤشر أسفل القائمة والبحث عن أي إشارات إلى 2.0.0.0 ، إزالة وإعادة إضافة 4.0.0.0 أحدث نسخة خدعة.

الغريب أن هذا تم تحديث معظم المراجع بشكل صحيح ، وإذا لم تكن تقارير كريستال ، ربما لم أكن قد لاحظت ...


لقد وجدت (على الأقل في Visual Studio 2010) أنك بحاجة إلى تعيين مستوى الإنتاج إلى مستوى تفصيلي على الأقل لتتمكن من تحديد المشكلة.

ربما تكون مشكلتي عبارة عن مرجع كان مرجع GAC سابقًا ، ولكن لم يعد هذا هو الحال بعد إعادة تثبيت الجهاز.


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


يقوم ASP.NET build manager بإنشاء موقع ويب بالانتقال عبر المجلدات أبجديًا ، ولكل مجلد ، فإنه يستنتج تبعياته ويبني التبعيات أولاً ومن ثم المجلد المحدد.

في هذه الحالة ، يتم تحديد المجلد الإشكالي الذي هو ~ / Controls ، ليتم بناؤه في البداية ، من سبب غير معروف ، حيث يقوم ببناء بعض عناصر التحكم هناك كمجموعة منفصلة بدلاً من داخل نفس التجميع مثل عناصر التحكم الأخرى (يبدو أنه أن تكون متصلاً بحقيقة أن بعض عناصر التحكم تعتمد على عناصر تحكم أخرى في نفس المجلد).

ثم المجلد التالي الذي تم بناؤه (~ / File-Center / Control) يعتمد على المجلد الجذر ~ / الذي يعتمد على ~ / Controls ، لذا يتم إنشاء المجلد ~ / Controls مرة أخرى فقط في هذه المرة عناصر التحكم التي تم فصلها إلى التجميع الخاصة بهم الآن إلى نفس التجميع مثل عناصر التحكم الأخرى مع التجميع المفصول مازال يتم الرجوع إليها.

حتى في هذه المرحلة 2 التجمع (على الأقل) لها نفس عناصر التحكم وفشل الإنشاء.

على الرغم من أننا ما زلنا لا نعرف سبب حدوث ذلك ، إلا أننا تمكنا من التغلب عليه من خلال تغيير اسم مجلد عناصر التحكم إلى ZControls ، وبهذه الطريقة لم يتم إنشاؤه قبل ~ / File-Center / Control ، فقط بعد هذه الطريقة وبنيت بها كما ينبغى.


إصلاح سريع:

انقر بزر الماوس الأيمن على الحل -> إدارة حزم NuGet للحل -> تحت Consolidate يمكنك معرفة ما إذا كان هناك إصدارات مختلفة من نفس الحزمة تم تثبيتها. إلغاء تثبيت إصدارات مختلفة وتثبيت أحدث إصدار.





ndepend