439 Stimmen

Behebung von MSB3247 - Gefundene Konflikte zwischen verschiedenen Versionen der gleichen abhängigen Assembly

Eine .NET 3.5 Lösung endete mit dieser Warnung beim Kompilieren mit msbuild.

Manchmal kann NDepend helfen, aber in diesem Fall gab es keine weiteren Details. Wie Bob Am Ende musste ich jede Baugruppe in ILDASM öffnen, bis ich diejenige fand, die eine ältere Version der abhängigen Baugruppe referenzierte.

Ich habe versucht, mit MSBUILD von VS 2010 Beta 2 (wie der Connect-Artikel darauf hinweist, dass dies in der nächsten Version der CLR behoben wurde), aber das hat nicht mehr Details entweder (vielleicht nach Beta 2 behoben) bieten

Gibt es einen besseren (automatisierten) Ansatz?

7voto

RouR Punkte 5719

Diese Warnung wurde für die Standardversion von ASP.NET MVC 4 beta generiert siehe hier

Bei jedem Wurf kann diese Warnung durch manuelles Bearbeiten der .csproj-Datei für Ihr Projekt.

modify........: Referenz Include="System.Net.Http"

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

6voto

Verwenden Sie einen Abhängigkeitsleser

Verwendung von 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

Auffinden von Baugruppen, auf die 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 obskure Befehlszeile führt dep.exe aus und leitet die Ausgabe zweimal an awk weiter, um

  • die über- und untergeordneten Elemente in eine einzige Spalte stellen (standardmäßig enthält jede Zeile ein übergeordnetes Element und ein untergeordnetes Element, um auszudrücken, dass dieses übergeordnete Element von diesem untergeordneten Element abhängt)
  • dann eine Art 'Gruppierung nach' unter Verwendung eines assoziativen Arrays vornehmen

Verstehen, wie diese Baugruppe in Ihren Mülleimer gelangt ist

$ 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 Tool Ihnen zeigen, dass System.Web.Http 5.2.3 aus Ihrer Abhängigkeit von FooLib stammt, während die Version 4.0.0 aus BarLib stammt.

Dann haben Sie die Wahl zwischen

  • die Eigentümer der Bibliotheken davon zu überzeugen, die gleiche Version zu verwenden
  • aufhören, einen von ihnen zu benutzen
  • Hinzufügen von verbindlichen Umleitungen in Ihrer Konfigurationsdatei, um die neueste Version zu verwenden

Wie man diese Dinge unter Windows ausführt

Wenn Sie keine Unix-Shell haben, müssen Sie eine herunterladen, bevor Sie das Programm awk et grep . Versuchen Sie eine der folgenden Möglichkeiten

4voto

Hamiora Punkte 551

Ich hatte dieses Problem auch und habe den Rat von AMissico befolgt, um das Problem zu entdecken (obwohl ich die Ausführlichkeitsstufe auf Detailliert setzen musste.

Nachdem ich den Schuldigen gefunden hatte, war das Problem eigentlich ganz einfach zu lösen.

Hintergrund: Ich habe mein Projekt von VS2008 auf VS2010 aktualisiert. In VS2008 war das Zielframework 3.5 und als ich es in VS2010 brachte, wechselte ich es zu 4 (Full). Ich habe auch einige Komponenten von Drittanbietern, einschließlich Crystal Reports, aktualisiert.

Es stellte sich heraus, dass die meisten Systemreferenzen auf die Version 4.0.0.0 verwiesen, einige jedoch nicht automatisch geändert worden waren (System und System.Web.Services) und immer noch auf 2.0.0.0 verwiesen. Crystal Reports verweist auf 4.0.0.0, und daher traten die Konflikte genau hier auf. Indem ich den Cursor auf die erste Systembibliothek im Projektmappen-Explorer setzte, in der Liste nach Verweisen auf 2.0.0.0 suchte, die neuere Version 4.0.0.0 entfernte und wieder hinzufügte, war die Sache erledigt.

Das Merkwürdige daran war, dass die meisten Verweise korrekt aktualisiert worden waren, und ohne die Crystal-Berichte hätte ich das wahrscheinlich nie bemerkt...

4voto

GorvGoyl Punkte 32029

Schnelle Lösung:

Rechtsklick auf die Projektmappe -> NuGet-Pakete für die Projektmappe verwalten -> Unter Konsolidieren können Sie sehen, ob verschiedene Versionen desselben Pakets installiert wurden. Deinstallieren Sie die verschiedenen Versionen und installieren Sie die neueste Version.

2voto

lex87 Punkte 1182

Wie erwähnt aquí müssen Sie die ungenutzten Verweise entfernen und die Warnungen verschwinden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X