Beheben von MSB3247 - Gefunden Konflikte zwischen verschiedenen Versionen der gleichen abhängigen Assembly

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

  •  18-09-2019
  •  | 
  •  

Frage

Eine .NET 3.5-Lösung mit dieser Warnung beendet, wenn mit msbuild kompilieren.

Manchmal helfen NDepend könnte in diesem Fall, aber es hat keine weiteren Details geben. Wie Bob ich zu öffnen jede Baugruppe zurückgreifen zu müssen schließlich in ILDASM, bis ich die eine gefunden, die eine ältere Version der abhängigen Anordnung wurde referenzieren.

Ich habe versucht, mit MSBUILD von VS 2010 Beta 2 (wie der Artikel Connect angegeben in der nächsten Version der CLR fixiert wurde), aber das legte kein Detail entweder (vielleicht feste Pfosten Beta 2)

Gibt es einen besseren (automatisierten) Ansatz?

War es hilfreich?

Lösung

ändern Sie die „MSBuild-Projekt Build-Ausgabe Ausführlichkeit“ auf „Detaillierte“ oder höher. Dazu gehen Sie folgendermaßen vor:

  1. Öffnen Sie den Optionen-Dialog. ( Extras -> Optionen ... )
  2. Im linken Baum, wählen Sie die Projekte und Lösungen Knoten, und wählen Sie dann Erstellen und Ausführen .
    • . Hinweis: wenn dieser Knoten nicht angezeigt wird, stellen Sie sicher, dass das Kontrollkästchen am unteren Rand des Dialogs alle Einstellungen anzeigen aktiviert ist
  3. In der Tools / Optionen-Seite, die, stellen Sie die MSBuild-Projekt Build-Ausgabe Ausführlichkeit Ebene auf die entsprechende Einstellung je nach Ihrer Version erscheint:

  4. Erstellen Sie das Projekt und sehen im Ausgabefenster.

Überprüfen Sie die MSBuild-Nachrichten aus. Die ResolveAssemblyReferences Aufgabe, die die Aufgabe ist, aus dem MSB3247 stammt, sollten Sie diese besondere Ausgabe debuggen helfen.

Mein konkreter Fall war ein falscher Verweis auf SqlServerCe. Siehe unten. Ich hatte zwei Projekte verweisen zwei verschiedene Versionen von SqlServerCe. Ich für das Projekt ging mit der älteren Version, die Referenz entfernt, dann hinzugefügt, um die richtige Referenz.

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.

Sie müssen nicht jede Baugruppe öffnen die Versionen von referenzierten Assemblys zu bestimmen.

  • Sie können prüfen, die Eigenschaften der einzelnen Referenz.
  • die Projekteigenschaften öffnen und die Versionen des Abschnitts Verweise überprüfen.
  • Öffnen Sie die Projekte mit einem Text-Editor.
  • Verwenden Sie .NET Reflector.

Andere Tipps

Mike Hadlow hat gepostet ein wenig Konsole app AsmSpy dass eher freundlich listet jede Baugruppe Referenzen genannt:

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

Dies ist ein viel schnellerer Weg zum Boden der Warnung MSB3247 zu bekommen, als auf dem MSBuild Ausgang abhängig zu sein.

Einige Zeit @AMissico Antwort ist nicht genug. In meinem Fall konnte ich nicht den Fehler in den Ausgabefenstern finden, damit ich eine Protokolldatei erstellen entschieden und analysieren, indem Sie die folgenden Schritte ausführen:

  1. Speichern des Build-Protokoll in einer Datei ... https: / /msdn.microsoft.com/en-us/library/ms171470.aspx

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

  2. den Text finden: warning MS... oder die spezifische Warnung Info: (z Linie 9293) Found conflicts between different versions... und das vollständige Detail des Konflikt Fehlers wird über diese Nachricht (z Zeile 9277) There was a conflicts between... Hier finden Sie die Fehlermeldung

Visual Studio 2013

Ich fand, dass (zumindest in Visual Studio 2010) können Sie die Ausgabe Ausführlichkeit mindestens Detaillierte einstellen müssen in der Lage sein, das Problem zu erkennen.

Es könnte sein, dass mein Problem ein Hinweis war, die zuvor eine GAC Referenz war, aber das war nicht mehr der Fall, nachdem meine Maschine wieder installieren.

Diese Warnung erzeugt für Standard ASP.NET MVC 4 Beta hier sehen

  

In jede Besetzung dieser Warnung kann durch manuelles Bearbeiten der beseitigt werden   CSPROJ für Ihre Projektdatei.

     

ändern ........: Referenz Include = "System.Net.Http"

     

lesen ......: Referenz Include = "System.Net.Http, Version = 4.0.0.0"

Ich hatte den gleichen Fehler und kann es nicht mit den anderen Antworten herauszufinden. Ich fand, dass wir „Konsolidieren“ NuGet Pakete.

  1. Rechtsklick auf die Lösung
  2. Klicken Sie Nuget Pakete verwalten
  3. Konsolidieren Register und Update auf die gleiche Version.

Verwenden Sie eine Abhängigkeit Leser

Mit dep.exe können Sie alle verschachtelten Abhängigkeiten eines ganzen Ordners auflisten. In Kombination mit Unix-Tools wie grep oder awk, kann es Ihnen helfen, Ihr Problem zu lösen

Die Suche nach Baugruppen in mehr als einer Version

verwiesen wird
$ 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            

Diese verdunkeln Befehlszeile dep.exe läuft dann die Ausgangsleitungen zweimal awk bis

  • legt die Eltern und Kind in einer einzigen Spalte (standardmäßig jede Zeile enthält einen Elternteil und ein Kind zum Ausdruck bringt, dass dieser Elternteil des Kindes abhängt)
  • dann eine Art von ‚Gruppe‘ verwendet eine assoziative Array

Das Verständnis, wie diese Anordnung in Ihrem ist

gezogen wurde
$ 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 

In diesem Beispiel würde das Werkzeug, das Sie zeigt, dass System.Web.Http 5.2.3 von Ihrer Abhängigkeit FooLib kommt, während die Version 4.0.0 von BarLib kommt.

Dann haben Sie die Wahl zwischen

  • zu überzeugen, die Eigentümer der Libs die gleiche Version zu verwenden,
  • stoppen einer mit ihnen
  • Hinzufügen Bindung Umleitungen in Ihrer Konfigurationsdatei die neueste Version zu verwenden,

Wie diese Sache in Windows ausführen

Wenn Sie nicht über ein Shell-Unix-Typ Sie benötigen ein herunterladen, bevor awkand grep ausführen zu können. Versuchen Sie eine der folgenden Aktionen

Ich hatte dieses Problem auch und AMissico Rat zu entdecken, das Problem (Obwohl mußte eingestellt Ausführlichkeit zu Detail verwendet.

Das Problem war eigentlich ziemlich geradlinig, aber auch nach den Schuldigen zu finden.

Hintergrund: Ich habe ein Upgrade mein Projekt von VS2008 auf VS2010. In VS2008 war das Ziel Framework 3.5 und wenn ich es in VS2010 gebracht wechselte ich es bis 4 (Full). Ich habe auch einige Komponenten von Drittanbietern aufgerüstet einschließlich Crystal Reports.

Es stellte sich die meisten Systemreferenzen, wo in der Version 4.0.0.0 zeigt aber ein paar automatisch geändert nicht hatte (System und System.Web.Services) und wurden noch in 2.0.0.0 suchen. Crystal Reports verweist 4.0.0.0 und so war dies, wo die Konflikte wurden auftreten. Einfach die Cursor in der Lösung Explorer, Cursor, um die Liste in der ersten Systembibliothek setzen und auf der Suche nach irgendwelchen Hinweisen auf 2.0.0.0 nach unten, das Entfernen und Wieder Hinzufügen neuen 4.0.0.0 Version des Trick.

Das seltsame war, dass die meisten der Referenzen korrekt aktualisiert worden war, und wenn es nicht so wäre für Crystal Reports-Berichte, hätte ich wahrscheinlich noch nie bemerkt ...

Ich habe eine Anwendung basierend auf Mike Hadlow Anwendung: AsmSpy .

Meine app ist eine WPF-Anwendung mit grafischer Benutzeroberfläche und herunterladen kann von meinem Hause Webserver sein: AsmSpyPlus. exe .

-Code finden Sie unter: GitHub

Wie bereits erwähnt hier , müssen Sie die nicht verwendeten Referenzen und die Warnungen entfernen gehen wird.

ASP.NET Build-Manager baut auf der Website von alphabetisch durch die Ordner gehen, und für jeden Ordner Zahlen es heraus, es Abhängigkeiten und die Abhängigkeiten aufbaut und dann den ausgewählten Ordner.

In diesem Fall wird die problematischen Ordner, die ~ / Controls ist, ausgewählt zu Beginn gebaut werden, aus noch unbekannten Gründen, es hat einige der Kontrollen dort als separate Baugruppe statt in der gleichen Anordnung wie andere Steuerelemente baut (scheint mit der Tatsache, dass einige Steuerelemente auf andere Steuerelemente im selben Ordner abhängig sind).

Dann wird der nächste Ordner, die gebaut wird (~ / Datei-Center / Control) ist abhängig von dem Stammordner ~ / die auf ~ / Kontrollen abhängig ist, so dass die Ordner ~ / Kontrollen gebaut wieder wird dieses Mal nur die Kontrollen die für die eigene Montage getrennt wurden, werden nun auf der gleichen Baugruppe wie andere Steuerelemente mit dem abgetrennten Montage noch verbunden verwiesen wird.

So an diesem Punkt 2 Montag (zumindest) die gleichen Kontrollen und die Erstellung fehl.

Auch wenn wir noch nicht wissen, warum dies passiert ist, wir in der Lage waren, um ihn zu arbeiten, indem Sie die Steuerelemente Ordnernamen ZControls ändern, auf diese Weise nicht vor ~ / Datei-Center / Steuerung eingebaut ist, erst nach und auf diese Weise es gebaut wird, wie es sollte.

Quick Fix:

Rechtsklick auf Lösung -> Manage NuGet Pakete für Lösung -> unter Konsolidieren Sie sehen können, wenn es verschiedene Versionen des gleichen Pakets sind installiert. Deinstallieren Sie verschiedene Versionen und installieren Sie die neueste.

Manchmal ist AutoGenerateBindingRedirects nicht genug (auch mit GenerateBindingRedirectsOutputType ). Die Suche nach allen There was a conflict Einträge und Fixieren sie nacheinander manuell kann langwierig sein, so schrieb ich ein kleines Stück Code, der die Log-Ausgabe analysiert und generiert sie für Sie (auf stdout Dumps):

// 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);

Tipp: Verwenden Sie MSBuild Binary und Structured Log Viewer und erzeugen nur Bindung Umleitungen für die Konflikte in dem Projekt, das aussendet die Warnung (das heißt, nur hinter diesen there was a conflict Linien an die Eingangstextdatei für den Code oben [AssemblyConflicts.txt]).

Ein einfachste Weg, ohne auf eine unter Berücksichtigung von (internen) Abhängigkeiten:

  1. Öffnen "Solution Explorer".
  2. Klicken Sie auf "Alle Dateien"
  3. Öffnen "Referenzen"
  4. Sie werden mit etwas anderen Symbol ein (oder mehr) Referenz (en) zu sehen ist als der Rest. Typischerweise ist es mit gelben Kasten schlagen Sie eine Notiz davon zu nehmen. Nur entfernen.
  5. Fügen Sie die Referenz und Ihren Code kompilieren.
  6. Das ist alles.

In meinem Fall war es ein Problem mit MySQL Referenz. Irgendwie konnte ich drei Versionen davon unter der Liste aller verfügbaren Referenzen aufzulisten. Ich folgte Verfahren 1 bis 6 oben und es funktionierte für mich.

Visual Studio für Mac Gemeinschaft hinaus:

Wie AMissico Antwort erfordert die Protokollebene zu ändern, und weder ASMSpy noch ASMSpyPlus ist als Cross-Plattform-Lösung, hier ist eine kurze Ergänzung für Visual Studio für Mac:

  

https://docs.microsoft.com/en -US / Visualstudio / mac / Kompilieren-und-Gebäude

Es ist in Visual Studio Gemeinschaft → Einstellungen ... → Projekte → Build Log → Ausführlichkeit

Wenn Sie ReSharper, entfernen Sie alle ungenutzten Referenz auf Ihrer Lösung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top