351 Stimmen

Warnung: Konflikte zwischen verschiedenen Versionen derselben abhängigen Assembly gefunden

Ich entwickle derzeit eine .NET-Anwendung, die aus 20 Projekten besteht. Einige dieser Projekte werden mit .NET 3.5 kompiliert, andere sind immer noch .NET 2.0-Projekte (bisher kein Problem).

Das Problem ist, dass ich immer die folgende Warnung erhalte, wenn ich eine externe Komponente einbinde:

Es wurden Konflikte zwischen verschiedenen Versionen derselben abhängigen Assembly gefunden.

Was genau bedeutet diese Warnung und gibt es vielleicht eine Möglichkeit, diese Warnung auszuschließen (zum Beispiel durch Verwendung von #pragma disable in den Quellcodedateien)?

441voto

Brian Low Punkte 11205

Diese Warnung bedeutet, dass zwei Projekte auf die gleiche Assembly verweisen (z.B. System.Windows.Forms), aber die beiden Projekte unterschiedliche Versionen benötigen. Sie haben ein paar Optionen:

  1. Kompilieren Sie alle Projekte neu, um die gleichen Versionen zu verwenden (z.B. alle auf .Net 3.5 verschieben). Dies ist die bevorzugte Option, da der gesamte Code mit den Versionen der Abhängigkeiten läuft, mit denen er kompiliert wurde.

  2. Fügen Sie eine binde Referenz hinzu. Dadurch wird die Warnung unterdrückt. Allerdings werden Ihre .Net 2.0-Projekte (im Laufzeitmodus) an die .Net 3.5-Versionen von abhängigen Assemblys wie System.Windows.Forms gebunden. Sie können schnell eine Verweisbindung hinzufügen, indem Sie in Visual Studio auf den Fehler doppelklicken.

  3. Verwenden Sie CopyLocal=true. Ich bin mir nicht sicher, ob dies die Warnung unterdrücken wird. Es bedeutet jedoch, wie in Option 2 oben, dass alle Projekte die .Net 3.5-Version von System.Windows.Forms verwenden werden.

Hier sind ein paar Möglichkeiten, die fehlerhafte(n) Referenz(en) zu identifizieren:

  • Sie können ein Dienstprogramm wie das unter https://gist.github.com/1553265 finden
  • Ein weiterer einfacher Weg ist, den Build Ausgabeverbosenheit (Tools, Optionen, Projekte und Lösungen, Build und Ausführen, MSBuild-Projektbuildausgabeverbosität, Detailliert) zu setzen und nach dem Bau, suchen Sie im Ausgabefenster nach der Warnung und sehen Sie sich den Text direkt darüber an. (Dank an pauloya, der dies in den Kommentaren zu dieser Antwort vorgeschlagen hat).

9 Stimmen

Nur für einen schnellen Weg, es zu finden, ohne das Dienstprogramm hinzuzufügen - wenn Sie die Bindungsumleitung hinzufügen (als Option 2), werden dort die betroffenen Referenzen angezeigt - falls gewünscht, können Sie dann eine der anderen Methoden verwenden, um damit umzugehen, und die Bindungsumleitung(en) aus Ihrer Konfigurationsdatei löschen.

240 Stimmen

Die einfachste Möglichkeit herauszufinden, was die "beanstandete(n) Referenz(en)" sind, besteht darin, die Build-Ausgabeverbundenheit (Tools, Optionen, Projekte und Lösungen, Erstellen und Ausführen, MSBuild-Projekterstellungs-Ausgabeverbundenheit, Detailliert) zu setzen und nach dem Erstellen im Ausgabefenster nach der Warnung zu suchen. Siehe den Text direkt darüber.

1 Stimmen

Alternativ können Sie VS auch den Bindungswechselpunkt erstellen lassen und dann einen Diff-Viewer verwenden, um zu sehen, was hinzugefügt wurde. Dadurch erfahren Sie, welche Referenz das Problem verursacht hat.

46voto

Matt Hamilton Punkte 193704

Grundsätzlich passiert das, wenn die Assemblys, auf die Sie verweisen, auf "Copy Local" auf "True" gesetzt sind, was bedeutet, dass eine Kopie der DLL zusammen mit Ihrer exe im Bin-Ordner platziert wird.

Da Visual Studio alle Abhängigkeiten einer referenzierten Assembly kopiert, ist es möglich, dass zwei verschiedene Builds derselben Assembly referenziert werden. Dies ist wahrscheinlicher, wenn Ihre Projekte in separaten Lösungen sind und daher separat kompiliert werden können.

Der Weg, wie ich das umgangen habe, ist "Copy Local" für Verweise in Assembly-Projekten auf "False" zu setzen. Machen Sie das nur für ausführbare/web Anwendungen, bei denen Sie die Assembly für das fertige Produkt benötigen, um ausgeführt zu werden.

Hoffe, das macht Sinn!

35voto

user1477388 Punkte 19891

Ich wollte die Lösung von pauloya posten, die sie oben in den Kommentaren bereitgestellt haben. Ich glaube, es ist die beste Lösung, um die problematischen Verweise zu finden.

Der einfachste Weg, um herauszufinden, was die "problematischen Verweise" sind, besteht darin, die Ausgabeverbosität für den Build festzulegen (Tools, Optionen, Projekte und Lösungen, Build und Ausführung, MSBuild-Projekt-Bauausgabenverhalten, Detailliert) und nach dem Build in der Ausgabewindow nach der Warnung zu suchen. Sehen Sie den Text direkt darüber.

Wenn Sie beispielsweise in der Ausgabekonsole nach "Konflikt" suchen, finden Sie möglicherweise etwas Ähnliches wie dies:

3>  There was a conflict between "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
3>      "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was chosen because it was primary and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was not.

Wie Sie sehen können, gibt es einen Konflikt zwischen den EF-Versionen 5 und 6.

5 Stimmen

Aber jetzt, da ich diese Informationen habe, wie kann ich den Fehler beheben? Ich kann sehen, wo der Konflikt liegt, aber ich kann nicht herausfinden, wo das Projekt die konfliktierende Version referenziert.

0 Stimmen

Hallo @Bassie, das erste, was zu tun wäre, ist, Ihre NuGet-Paketdatei zu überprüfen und festzustellen, ob Sie alle Dateien auf die gleiche Version des Pakets aktualisieren müssen. Dies können Sie tun, indem Sie einen Befehl ähnlich wie update-package [Ihr Paketname] -Version 6.0.0 -reinstall ausführen, wie in meiner Antwort hier stackoverflow.com/questions/22685530/…

0 Stimmen

@Bassie, Sie können tun, was die Warnung vorschlägt, und die Bindungsumleitung zur app.config-Datei hinzufügen! (wenn das Aktualisieren keine Option ist.)

29voto

Tiago Gouvêa Punkte 12718

Auf Visual Studio, wenn Sie mit der rechten Maustaste auf die Lösung klicken und NuGet-Pakete verwalten, gibt es einen "Konsolidieren"-Tab, der alle Pakete auf dieselbe Version setzt.

23voto

Gorgsenegger Punkte 6904

Ich hatte dasselbe Problem mit einem meiner Projekte, jedoch hat keines der oben genannten Dinge geholfen, um die Warnung zu lösen. Ich habe das ausführliche Build-Logfile überprüft, ich habe AsmSpy verwendet, um zu bestätigen, dass ich die korrekten Versionen für jedes Projekt in der betroffenen Lösung verwendet habe, ich habe die tatsächlichen Einträge in jeder Projektdatei überprüft - nichts hat geholfen.

Letztendlich stellte sich heraus, dass das Problem eine verschachtelte Abhängigkeit eines der Referenzen war, die ich in einem Projekt hatte. Diese Referenz (A) erforderte wiederum eine andere Version von (B), die direkt von allen anderen Projekten in meiner Lösung referenziert wurde. Das Aktualisieren der Referenz im referenzierten Projekt hat es gelöst.

Lösung A
+--Projekt A
   +--Referenz A (Version 1.1.0.0)
   +--Referenz B
+--Projekt B
   +--Referenz A (Version 1.1.0.0)
   +--Referenz B
   +--Referenz C
+--Projekt C
   +--Referenz X (das indirekt Referenz A referenziert, aber z.B. Version 1.1.1.0)

Lösung B
+--Projekt A
   +--Referenz A (Version 1.1.1.0)

Ich hoffe, das obige zeigt, was ich meine. Es hat mich ein paar Stunden gekostet, um herauszufinden, sodass hoffentlich auch jemand anders davon profitieren wird.

1 Stimmen

Das gleiche Problem hier. Allerdings habe ich keine Möglichkeit, den Verweis auf eine neuere Version zu aktualisieren. Ich habe versucht, eine App.config zu verwenden: obwohl es für die Anwendung funktioniert, scheint Visual Studio 2010 es während des Builds zu ignorieren.

1 Stimmen

Wow, Ich hatte diese Probleme seit zwei Monaten und konnte es nicht lokalisieren und lösen. Aus irgendeinem Grund würde es nur beim Debuggen abstürzen und in einigen Fällen würde es manuell die lästige .dll durch die echte in dem Bin-Ordner ersetzen, wenn das passierte. Debuggen war eine echte Qual. Als ich deine Antwort gelesen habe, wurde mir klar, dass genau das bei mir passierte und ich habe es in ungefähr 5 Minuten behoben :)

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