Beheben von MSB3247 - Gefunden Konflikte zwischen verschiedenen Versionen der gleichen abhängigen Assembly
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?
Lösung
ändern Sie die „MSBuild-Projekt Build-Ausgabe Ausführlichkeit“ auf „Detaillierte“ oder höher. Dazu gehen Sie folgendermaßen vor:
- Öffnen Sie den Optionen-Dialog. ( Extras -> Optionen ... )
- 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
-
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:
- Diagnose , wenn auf VS2012, VS2013 oder VS2015 (die Nachricht in diesen Versionen sagt sollten Sie "Detailed", ) > aber schlicht falsch ist, sollten Sie verwenden"
- Detaillierte , wenn Sie sind auf VS2010
- normal wird in VS2008 oder älter ausreichen.
- 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:
-
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
-
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...
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.
- Rechtsklick auf die Lösung
- Klicken Sie Nuget Pakete verwalten
- 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 awk
and 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:
- Öffnen "Solution Explorer".
- Klicken Sie auf "Alle Dateien"
- Öffnen "Referenzen"
- 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.
- Fügen Sie die Referenz und Ihren Code kompilieren.
- 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.