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

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

  •  18-09-2019
  •  | 
  •  

سؤال

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

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

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

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

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

المحلول

تغيير "مشروع Msbuild بناء نظام الإخراج" ل "مفصل" أو أعلى. لكي تفعل هذا، اتبع هذه الخطوات:

  1. إحضار مربع حوار "خيارات" (أدوات -> خيارات ...).
  2. في شجرة اليد اليسرى، حدد المشاريع والحلول عقدة، ثم حدد بناء والتشغيل.
    • ملاحظة: إذا لم تظهر هذه العقدة، فتأكد من أن خانة الاختيار في أسفل مربع الحوار عرض كل الإعدادات مفحوص.
  3. في صفحة الأدوات / الخيارات التي تظهر، اضبط مشروع Msbuild بناء انتاج المستوى إلى الإعداد المناسب اعتمادا على الإصدار الخاص بك:

  4. بناء المشروع وإلقاء نظرة على نافذة الإخراج.

تحقق من رسائل msbuild. ال 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.

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

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

نصائح أخرى

مايك هادلو لديه نشر تطبيق Console صغير يسمى ASMSPY يسرد هذه مراجع كل مراجع كلية:

Reference: System.Net.Http.Formatting
        4.0.0.0 by Shared.MessageStack
        4.0.0.0 by System.Web.Http

Reference: System.Net.Http
        2.0.0.0 by Shared.MessageStack
        2.0.0.0 by System.Net.Http.Formatting
        4.0.0.0 by System.Net.Http.WebRequest
        2.0.0.0 by System.Web.Http.Common
        2.0.0.0 by System.Web.Http
        2.0.0.0 by System.Web.Http.WebHost

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

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

  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... Find the error message

Visual Studio 2013.

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

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

هذا التحذير الناتج عن افتراضي ASP.NET MVC 4 بيتاانظر هنا

في، يمكن إلغاء أي إلقاء هذا التحذير من خلال تحرير ملف .csproj يدويا لمشروعك.

تعديل ........: المرجع تشمل = "system.net.http"

لقراءة ......: تشمل المرجع = "system.net.http، الإصدار = 4.0.0.0"

كان لدي نفس الخطأ ولا يمكن معرفة إجابات أخرى. لقد وجدت أننا نستطيع "توحيد" حزم Nuget.

  1. انقر بزر الماوس الأيمن على الحل
  2. انقر فوق إدارة حزم Nuget
  3. دمج علامة التبويب وتحديث نفس الإصدار.

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

استخدام dep.exe. يمكنك سرد جميع التبعيات المتداخلة للمجلد بأكمله. جنبا إلى جنب مع أدوات يونيكس مثل 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

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

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

$ 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 يأتي من تبعية الخاص بك إلى FOLEAB بينما يأتي الإصدار 4.0.0 من Barlib.

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

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

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

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

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

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

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

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

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

لقد قمت بتطبيق بناء على مايك هادلو التطبيق: ASMSPY.

تطبيقي هو تطبيق WPF مع واجهة المستخدم الرسومية ويمكن تنزيله من My Home WebServer: asmspyplus.exe..

الرمز متاح في: جيثب

Gui Sample

كما ذكر هنا, ، تحتاج إلى إزالة المراجع غير المستخدمة وستذهب التحذيرات.

يقوم ASP.NET Build Manager ببناء موقع الويب عن طريق الذهاب عبر المجلدات أبجديا، ولكل مجلد يقوم بأرقام تعايشه ويبني التبعيات أولا ثم المجلد المحدد.

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

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

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

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

إصلاح سريع:

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

بعض الأحيان AutoGenerateBindingRedirects ليس كافيا (حتى مع GenerateBindingRedirectsOutputType). البحث عن كل There was a conflict يمكن أن تكون الإدخالات وتحديدها يدويا واحدا تلو الآخر مملة، لذلك كتبت جزءا صغيرا من التعليمات البرمجية التي يوزع إخراج السجل ويقوم بإنشاءها لك (مقالب stdout):

// Paste all "there was a conflict" lines from the msbuild diagnostics log to the file below
const string conflictFile = @"C:\AssemblyConflicts.txt";

var sb = new StringBuilder();
var conflictLines = await File.ReadAllLinesAsync(conflictFile);
foreach (var line in conflictLines.Where(l => !String.IsNullOrWhiteSpace(l)))
{
    Console.WriteLine("Processing line: {0}", line);

    var lineComponents = line.Split('"');
    if (lineComponents.Length < 2) 
        throw new FormatException("Unexpected conflict line component count");

    var assemblySegment = lineComponents[1];
    Console.WriteLine("Processing assembly segment: {0}", assemblySegment);
    var assemblyComponents = assemblySegment
                              .Split(",")
                              .Select(kv => kv.Trim())
                              .Select(kv => kv.Split("=")
                              .Last())
                              .ToArray();

    if (assemblyComponents.Length != 4) 
        throw new FormatException("Unexpected conflict segment component count");

    var assembly = assemblyComponents[0];
    var version = assemblyComponents[1];
    var culture = assemblyComponents[2];
    var publicKeyToken = assemblyComponents[3];

    Console.WriteLine("Generating assebmly redirect for Assembly={0}, Version={1}, Culture={2}, PublicKeyToken={3}", assembly, version, culture, publicKeyToken);
    sb.AppendLine($"<dependentAssembly><assemblyIdentity name=\"{assembly}\" publicKeyToken=\"{publicKeyToken}\" culture=\"{culture}\" /><bindingRedirect oldVersion=\"0.0.0.0-{version}\" newVersion=\"{version}\" /></dependentAssembly>");
}

Console.WriteLine("Generated assembly redirects:");
Console.WriteLine(sb);

نصيحة: استخدام Msbuild ثنائي ومشاهد سجل منظم ويولد فقط إعادة توجيهات ملزمة للنزاعات في المشروع الذي ينبعثذ التحذير (أي فقط هؤلاء there was a conflict خطوط إلى ملف الإدخال النصي للرمز أعلاه [AssemblyConflicts.txt]).

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

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

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

Visual Studio إضافة مجتمع Mac:

كما إجابة أميسيكو يتطلب تغيير مستوى السجل، ولا يتوفر ASMSPY أو Asmspyplus كحل عبور منصة، وهنا إضافة قصيرة لاستوديو Visual Studio لنظام التشغيل Mac:

https://docs.microsoft.com/en-us/visualstudio/mac/compiling--Building.

انها في مجتمع ستوديو المرئي ← تفضيلات ... ← مشاريع ← بناء سجل ← حمية

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

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