Wie kann ich Assemblyversionskonflikte mit JSON.NET beheben, nachdem ich NuGet-Paketreferenzen in einem neuen ASP.NET MVC 5-Projekt aktualisiert habe?

89

Ich habe in VS 2013 (Update 1) ein neues ASP.NET MVC 5-Webprojekt erstellt und dann alle NuGet-Pakete aktualisiert. Wenn ich das Projekt erstelle, wird folgende Warnung angezeigt:

Warnung MSB3243: Konflikt zwischen "Newtonsoft.Json, Version = 6.0.0.0, Kultur = neutral, PublicKeyToken = 30ad4fe6b2a6aeed" und "Newtonsoft.Json, Version = 4.5.0.0, Kultur = neutral, PublicKeyToken = 30ad4fe6b2a6aeed" kann nicht gelöst werden.

Wenn ich jedoch die web.config überprüfe, sehe ich, dass eine Bindungsumleitung vorhanden ist:

  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
  </dependentAssembly>

Welches ist genau das, was die Warnung rät.

Wie kann ich diese Warnung beheben?

Jim Lamb
quelle
Ja, ich habe einen vollständigen Umbau durchgeführt. Ich habe auch NuGet auf den neuesten Stand gebracht, eine neue Lösung erstellt und genau das gleiche Problem reproduziert.
Jim Lamb

Antworten:

106

Hier die Schritte, mit denen ich die Warnung behoben habe:

  • Projekt in VS entladen
  • Bearbeiten Sie die .csproj-Datei
  • Suchen Sie nach allen Verweisen auf die Assembly Newtonsoft.Json
    • Gefunden zwei, eins zu v6 und eins zu v5
    • Ersetzen Sie den Verweis auf v5 durch v6
  • Projekt neu laden
  • Fehler beim Erstellen und Erkennen von Assemblyreferenzen
  • Zeigen Sie Referenzen an und sehen Sie, dass Newtonsoft.Json jetzt zwei enthält. Entfernen Sie den Fehler, der nicht behoben werden kann.
  • Wiederaufbau - keine Warnungen
Jim Lamb
quelle
12
Ich habe zwei Referenzen gefunden, eine für v6 und eine für v5, aber ich habe die v5 gelöscht (nicht ersetzt). Danach hatte ich keine Probleme wie "Assembly Reference Failure" oder zwei Verweise auf Newtonsoft.Json in der Benutzeroberfläche. Ich vermute , jemand verstopfteinstall.ps1
ta.speot.is
Danke für die Lösung. Auch ich habe die ältere Referenz aus der Projektdatei gelöscht und hatte keine Probleme.
Charles Prakash Dasari
31
+1 - Es macht mich wirklich verrückt, wenn ich solche Sachen machen muss. Aus diesem Grund zögere ich immer, im Nuget-Paket-Manager auf Upgrade zu klicken.
hylander0
1
Ich hatte dieses Problem und habe es behoben, indem ich die zusätzliche Referenz entfernt habe, von der ich nicht wusste, dass sie vorhanden ist. Dies ist der Link zum Microsoft Connect-Fehler, der die Hauptursache für die vorhandene zusätzliche Referenz ist: connect.microsoft.com/VisualStudio/feedback/details/816725/… .
Martin Costello
1
In meinem Fall gab es Verweise auf zwei verschiedene Versionen von Newtonsoft.Json 11.0.1 und 11.0.2, obwohl es sich über Version 6.0 beschwerte.
Daniel Lobo
31

Ich hatte dieses Problem, weil ich Pakete aktualisiert habe, einschließlich Microsoft.AspNet.WebApi, das einen Verweis auf Newtonsoft.Json 4.5.6 enthält, und ich hatte bereits Version 6 installiert. Es war nicht klug genug, die Version 6 zu verwenden.

Um das Problem zu beheben, habe ich nach dem WebApi-Update die Tools> NuGet Package Manager> Pacakge Manager Console geöffnet und Folgendes ausgeführt:

 Update-Package Newtonsoft.Json

Das Protokoll zeigte, dass die Versionen 6.0.x und 4.5.6 alle auf die neueste Version aktualisiert wurden und alles in Ordnung war.

Ich habe das Gefühl, dass dies wieder auftauchen wird.

McGaz
quelle
1
Ich hatte das Problem mit mehreren verschiedenen Versionen in meiner Lösung, die mehrere Projekte enthalten. Dies hat das Problem vollständig behoben und alle auf das neueste JSON.net aktualisiert. Nett!
c0d3p03t
1
Dies war die einfachste und direkteste Lösung, die mein Problem behoben hat. Vielen Dank!
youngrrrr
21

Ich habe festgestellt, dass das Löschen dieses Abschnitts aus der Projektdatei das Problem behebt.

<ItemGroup>
<Reference Include="Newtonsoft.Json">
  <HintPath>..\packages\Newtonsoft.Json.6.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>

szmulder
quelle
Das ist es. Ich nehme an, dass keiner von Newtonsoft.Json.6.0.1 / 6.0.3 / 6.0.5 mit der Bindungsumleitung übereinstimmt. '' OldVersion = "0.0.0.0-6.0.0.0" '' Aber ich weiß nicht, wie man einen richtigen schreibt
fantastisch
Dies war auch mein Problem, ich bin mir nicht sicher, was es hinzugefügt hat.
Amnesie
Hat für mich gearbeitet. Fehler im Zusammenhang mit einem Konflikt zwischen Version 6.0 und Version 12.0. Die Elementgruppenreferenz war v11.0. Ich bin mir also nicht sicher, was passiert, aber das Entfernen der Elementgruppe scheint es gelöst zu haben, was das Entfernen des Kompilierungsfehlers angeht.
Brian.S
13

Wenn keines der oben genannten Verfahren funktioniert, versuchen Sie es in web.config oder app.config:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30AD4FE6B2A6AEED" culture="neutral"/>
            <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>
ZeroDotNet
quelle
Dies ist am besten geeignet, wenn Sie ein vorhandenes Projekt mit der höheren Version haben und eine Abhängigkeit hinzufügen, die eine ältere Version desselben Pakets verwendet, sodass Sie die alte Version auf die neue umleiten.
Ismail Hawayel
13

Ich habe ein Upgrade von Newtonsoft.Json 11.0.1 auf 12.0.2 durchgeführt. Beim Öffnen der Projektdatei in Notepad ++ habe ich beides entdeckt

<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
      <HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>

und

<ItemGroup>
    <Reference Include="Newtonsoft.Json">
      <HintPath>..\packages\Newtonsoft.Json.11.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>
  </ItemGroup>

Ich habe die ItemGroup gelöscht, die die Referenz mit dem Hinweispfad zu Version 11.0.1 umschließt.

Diese Probleme können wahnsinnig frustrierend sein. Darüber hinaus folgen Entwickler häufig den gleichen Schritten wie bei früheren Projekteinstellungen. Bei den vorherigen Setups ist das Problem nicht aufgetreten. Aus irgendeinem Grund wird die Projektdatei gelegentlich falsch aktualisiert.

Ich wünschte verzweifelt, Microsoft würde diese Probleme mit der Hölle der Visual Studio-DLLs beheben. Es kommt viel zu oft vor und führt dazu, dass der Fortschritt zum Stillstand kommt, bis er behoben ist, oft durch Ausprobieren.

Jeremy Ray Brown
quelle
1
Das war genau das Problem. Vielen Dank!
George Fabish
8

Die endgültige Lösung für Ihre Assembly-Umleitungsfehler

Okay, hoffentlich sollte dies helfen, etwaige (vernünftige) Unstimmigkeiten bei Baugruppenreferenzen zu beheben ...

  1. Überprüfen Sie den Fehler.

Surfen Sie zur Website

  1. Überprüfen Sie web.config nach der Assemblyumleitung. Erstellen Sie eine, wenn nicht vorhanden.

Bestehende web.config-Assemblyumleitung

  1. Klicken Sie mit der rechten Maustaste auf die Referenz für die Baugruppe und wählen Sie Eigenschaften.

Montage in der Referenzliste im jeweiligen Projekt

  1. Überprüfen Sie die Version (nicht die Laufzeitversion) in der Eigenschaftentabelle. Kopiere das.

Eigenschaftentabelle mit Version der Baugruppe

  1. In das Attribut newVersion einfügen.

Umleitung der web.config-Assembly mit aktualisierter newVersion

  1. Ändern Sie der Einfachheit halber den letzten Teil der alten Version in etwas Hoches, Rundes und Imaginäres.

Umleitung der web.config-Assembly mit aktualisierter oldVersion

Jubeln.


quelle
Diese Antwort hat mir viel Zeit gespart! Ich hatte eine Webanwendung, die eine benutzerdefinierte C # -Bibliothek verwendete. Beide verwendeten dasselbe Nuget-Paket, aber die Webanwendung hat eine ältere Version als die Bibliothek, und die Umleitung enthielt nicht die Version, die die Bibliothek verwendete.
War Gravy
4

Denken Sie daran, dass mit der Bindungsumleitung

oldVersion = "0.0.0.0-6.0.0.0"

Sie sagen, dass die alten Versionen der DLL zwischen Version 0.0.0.0 und Version 6.0.0.0 liegen.

Sherlock-jr
quelle
1
oldVersionist hier eigentlich ein bisschen falsch, was Sie sagen ist, dass Ihre Assembly / Exe mit einem Verweis auf eine Version im Bereich erstellt wurde 0.0.0.0-6.0.0.0und dass die tatsächlich installierte (und bevorzugte) Version der Wert unter ist newVersion(alte Version wäre besser formuliert als "erwartete Version" und neue Version würden besser als "tatsächlich verfügbare Version" formuliert)
nichts ist notwendig
2

Niemand erwähnte Folgendes, was nach meinem Verständnis die richtige Lösung ist:

Gehen Sie zum csproj des Projekts, in dem das Nuget installiert ist, und setzen Sie das AutoGEneratedBindingRedirectsauf false.

<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>

Vollständiger Artikel in MSDN.

Veverke
quelle
1

Ich habe mein Paket aktualisiert und sogar neu installiert - aber ich habe immer noch genau den gleichen Fehler wie das erwähnte OP erhalten. Ich habe die referenzierte DLL manuell bearbeitet, indem ich Folgendes getan habe.

Ich habe die Datei newtonsoft.json.dll aus meiner Referenz entfernt und die DLL dann manuell aus der bin-Direktive gelöscht. Dann habe ich die Datei newtonsoft.json.dll manuell aus dem Nuget-Paketordner in den Projektbehälter kopiert und dann die Referenz hinzugefügt, indem ich zur DLL-Datei navigiert habe.

Jetzt baut sich mein Projekt wieder auf.

Adam Heeg
quelle
0

Ich hatte ein ähnliches Problem und wollte nur eine Antwort für andere in meiner Situation veröffentlichen.

Ich habe eine Lösung, die eine ASP.NET-Webanwendung mit mehreren anderen lib-Projekten der C # -Klasse ausführt.

Meine ASP.NET-Webanwendung verwendete nicht json, sondern andere Projekte, in denen.

So habe ich es behoben:

  1. Ich habe sichergestellt, dass alle Projekte, die die neueste Version (6) mit NuGet Update verwenden, für alle Projekte verwendet werden, die derzeit eine Version von json verwenden - dies hat das Problem nicht behoben
  2. Ich habe json mit NuGet zur Webanwendung hinzugefügt - dies hat das Problem behoben (lassen Sie mich näher auf das Warum eingehen):

Schritt 2 bestand zunächst darin, Konfigurationsinformationen für json hinzuzufügen, die darauf hindeuten, dass alle Projekte unabhängig von ihrer Version die neueste Version (6) verwenden. Das Hinzufügen der Assemblybindung zu Web.Config ist höchstwahrscheinlich das Update.

In Schritt 2 wurde jedoch auch ein älterer Code bereinigt. Es stellte sich heraus, dass wir zuvor eine alte Version (5) von json in unserer Webanwendung verwendet haben und die NuGet-Ordner nicht gelöscht wurden, als die Referenz (ich vermute: manuell) entfernt wurde. Durch Hinzufügen des neuesten json (6) wurden die alten Ordner entfernt (json v5). Dies könnte auch Teil des Fixes sein.

Nick Niebling
quelle
0

Veverke erwähnte, dass es möglich ist, die Generierung von Bindungsumleitungen zu deaktivieren, indem AutoGEneratedBindingRedirects auf false gesetzt wird. Ich bin mir nicht sicher, ob es eine neue Sache ist, seit diese Frage veröffentlicht wurde, aber es gibt eine Option "Überspringen von Bindungsumleitungen überspringen" in Tools / Optionen / Nuget Packet Manager, die umgeschaltet werden kann. Standardmäßig ist es deaktiviert, was bedeutet, dass die Weiterleitungen angewendet werden. In diesem Fall müssen Sie jedoch alle erforderlichen Bindungsumleitungen manuell verwalten.

Svein Terje Gaup
quelle