Jak mogę naprawić konflikty wersji zestawu z JSON.NET po zaktualizowaniu odwołań do pakietów NuGet w nowym projekcie ASP.NET MVC 5?

89

Utworzyłem nowy projekt sieci Web ASP.NET MVC 5 w VS 2013 (aktualizacja 1), a następnie zaktualizowałem wszystkie pakiety NuGet. Kiedy buduję projekt, otrzymuję następujące ostrzeżenie:

ostrzeżenie MSB3243: Brak możliwości rozwiązania konfliktu między „Newtonsoft.Json, Version = 6.0.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed” i „Newtonsoft.Json, Version = 4.5.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed”.

Kiedy jednak sprawdzam plik web.config, widzę, że istnieje przekierowanie wiążące:

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

Dokładnie to radzi ostrzeżenie.

Jak mogę naprawić to ostrzeżenie?

Jim Lamb
źródło
Tak, wykonałem pełną przebudowę. Zaktualizowałem również NuGet do najnowszego, utworzyłem nowe rozwiązanie i odtworzyłem dokładnie ten sam problem.
Jim Lamb

Odpowiedzi:

106

Oto kroki, które zastosowałem, aby naprawić ostrzeżenie:

  • Zwolnij projekt w VS
  • Edytuj plik .csproj
  • Wyszukaj wszystkie odwołania do zestawu Newtonsoft.Json
    • Znaleziono dwa, jeden do v6 i jeden do v5
    • Zastąp odwołanie do v5 v6
  • Wczytaj ponownie projekt
  • Kompiluj i zwróć uwagę na błąd odwołania do zestawu
  • Wyświetl odwołania i zobacz, że są teraz dwa pliki do Newtonsoft.Json. Usuń ten, którego nie udało się rozwiązać.
  • Przebuduj - bez ostrzeżeń
Jim Lamb
źródło
12
Znalazłem dwa odniesienia, jeden do wersji 6 i jeden do wersji 5, ale usunąłem (nie zastąpiłem) wersją 5. Po tym nie miałem żadnych problemów, takich jak „błąd odwołania do zestawu” lub dwa odwołania do Newtonsoft.Json w interfejsie użytkownika. Zgaduję, że ktoś jest wypchanyinstall.ps1
ta.speot.is
Dzięki za rozwiązanie. Ja również usunąłem starsze odniesienie z pliku projektu i nie miałem żadnych problemów.
Charles Prakash Dasari
31
+1 - Naprawdę doprowadza mnie do szału, kiedy muszę robić takie rzeczy. Dlatego zawsze waham się przed kliknięciem uaktualnienia w menedżerze pakietów NuGet.
hylander0
1
Miałem ten problem i naprawiłem go, usuwając dodatkowe odniesienie, o którym nie zdawałem sobie sprawy. To jest łącze do błędu Microsoft Connect, który jest główną przyczyną znajdującego się tam dodatkowego odniesienia: connect.microsoft.com/VisualStudio/feedback/details/816725/… .
Martin Costello
1
W moim przypadku były odniesienia do dwóch różnych wersji Newtonsoft.Json 11.0.1 i 11.0.2, chociaż narzekał na wersję 6.0.
Daniel Lobo,
31

Miałem ten problem, ponieważ zaktualizowałem pakiety, w tym Microsoft.AspNet.WebApi, który ma odniesienie do Newtonsoft.Json 4.5.6 i mam już zainstalowaną wersję 6. Korzystanie z wersji 6 nie było wystarczająco sprytne.

Aby rozwiązać ten problem, po aktualizacji WebApi otworzyłem Narzędzia> Menedżer pakietów NuGet> Konsola Menedżera Pacakge i uruchomiłem:

 Update-Package Newtonsoft.Json

Dziennik wykazał, że wersje 6.0.x i 4.5.6 zostały zaktualizowane do najnowszej i wszystko było w porządku.

Mam przeczucie, że to się powtórzy.

McGaz
źródło
1
Miałem problem z wieloma różnymi wersjami w moim rozwiązaniu, które zawiera wiele projektów, to całkowicie naprawiło i zaktualizowało wszystko do najnowszej JSON.net. Ładny!
c0d3p03t
1
To było najłatwiejsze i najprostsze rozwiązanie, które rozwiązało mój problem. Dzięki!
youngrrrr
21

Znalazłem usunięcie tej sekcji z pliku projektu, aby rozwiązać problem.

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

szmulder
źródło
To jest to. Przypuszczam, że żaden z Newtonsoft.Json.6.0.1 / 6.0.3 / 6.0.5 nie pasuje do przekierowania powiązania '' oldVersion = "0.0.0.0-6.0.0.0" '' Ale nie wiem, jak napisać poprawny
fantastyczne
To też był mój problem, nie jestem pewien, co go dodało.
amnezja
Pracował dla mnie. Błąd związany z konfliktem między wersjami 6.0 i 12.0. Odniesienie do grupy pozycji dotyczyło wersji 11.0. Nie jestem więc pewien, co się dzieje, ale wydaje się, że usunięcie grupy elementów rozwiązało problem, jeśli chodzi o usunięcie błędu kompilacji.
Brian S.
13

Jeśli żadne z powyższych nie działa, spróbuj użyć tego w web.config lub 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
źródło
Najlepiej sprawdza się w sytuacji, gdy masz istniejący projekt korzystający z wyższej wersji i dodajesz zależność, która używa starszej wersji tego samego pakietu, więc przekierowujesz starą wersję do nowej.
Ismail Hawayel
13

Zaktualizowałem z Newtonsoft.Json 11.0.1 do 12.0.2. Otwierając plik projektu w Notepad ++, odkryłem oba

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

i

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

Usunąłem ItemGroup, zawijając odwołanie ze ścieżką podpowiedzi do wersji 11.0.1.

Znalezienie tych problemów może być szalenie frustrujące. Co więcej, programiści często wykonują te same kroki, co poprzednie konfiguracje projektów. Wcześniejsze konfiguracje nie napotkały problemu. Z jakiegoś powodu plik projektu jest czasami nieprawidłowo aktualizowany.

Desperacko chciałbym, aby Microsoft naprawił te problemy z bibliotekami DLL Visual Studio. Zdarza się to zbyt często i powoduje, że postęp zatrzymuje się, dopóki nie zostanie naprawiony, często metodą prób i błędów.

Jeremy Ray Brown
źródło
1
To był właśnie problem. Dzięki!
George Fabish
8

Ostateczne rozwiązanie błędów przekierowania zestawu

Okay, miejmy nadzieję, że to pomoże rozwiązać wszelkie (rozsądne) rozbieżności w odniesieniach do zestawu ...

  1. Sprawdź błąd.

Wejdź na stronę internetową

  1. Sprawdź plik web.config po przekierowaniu zestawu. Utwórz, jeśli nie istnieje.

Istniejące przekierowanie zestawu web.config

  1. Kliknij prawym przyciskiem myszy odniesienie do zespołu i wybierz opcję Właściwości.

Montaż na liście referencyjnej, w odpowiednim projekcie

  1. Sprawdź wersję (nie wersję środowiska wykonawczego) w tabeli Właściwości. Skopiuj to.

Tabela właściwości przedstawiająca wersję zespołu

  1. Wklej do atrybutu newVersion.

Przekierowanie zestawu web.config ze zaktualizowaną wersją newVersion

  1. Dla wygody zmień ostatnią część starej wersji na coś wysokiego, okrągłego i wyimaginowanego.

Przekierowanie zestawu web.config ze zaktualizowaną wersją starej wersji

Cieszyć.


źródło
Ta odpowiedź zaoszczędziła mi dużo czasu! Miałem aplikację internetową, która korzystała z niestandardowej biblioteki C #, obie korzystały z tego samego pakietu NuGet, ale aplikacja internetowa ma starszą wersję niż biblioteka, a przekierowanie nie zawierało wersji używanej przez bibliotekę.
War Gravy,
4

Pamiętaj o tym przy przekierowaniu wiązania

oldVersion = „0.0.0.0–6.0.0.0”

Mówisz, że stare wersje biblioteki dll znajdują się między wersją 0.0.0.0 a wersją 6.0.0.0.

Sherlock-jr
źródło
1
oldVersionjest tutaj trochę myląca, mówisz, że twój zestaw / plik exe został zbudowany z odniesieniem do wersji z zakresu 0.0.0.0-6.0.0.0i że faktycznie zainstalowana (i preferowana) wersja to wartość pod newVersion(stara wersja byłaby lepiej sformułowana jako „oczekiwana wersja”, a nowa wersja będzie lepiej sformułowana jako „rzeczywista dostępna wersja”)
nic niepotrzebnego.
2

Nikt nie wspomniał o następujących, które w moim rozumieniu jest właściwym rozwiązaniem:

Go csproj projektu, gdzie zainstalowany jest Nuget i ustaw AutoGEneratedBindingRedirectssię false.

<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>

Pełny artykuł w MSDN.

Veverke
źródło
1

Zaktualizowałem pakiet, a nawet ponownie go zainstalowałem - ale nadal otrzymywałem dokładnie ten sam błąd, co wspomniany OP. Ręcznie edytowałem bibliotekę DLL, do której istnieje odwołanie, wykonując następujące czynności.

Usunąłem plik newtonsoft.json.dll z mojego pliku referencyjnego, a następnie ręcznie usunąłem plik .dll z katalogu bin. Następnie ręcznie skopiowałem plik newtonsoft.json.dll z folderu pakietu NuGet do kosza projektu, a następnie dodałem odwołanie, przeglądając plik dll.

Teraz mój projekt jest ponownie budowany.

Adam Heeg
źródło
0

Miałem podobny problem i po prostu chciałem zamieścić odpowiedź dla innych w mojej sytuacji.

Mam rozwiązanie, w którym działa aplikacja sieci Web ASP.NET z wieloma innymi projektami lib klasy C #.

Moja aplikacja internetowa ASP.NET nie używała json, ale innych projektów, w których.

Oto jak to naprawiłem:

  1. Upewniłem się, że wszystkie projekty używają najnowszej wersji (6) przy użyciu aktualizacji NuGet we wszystkich projektach korzystających obecnie z dowolnej wersji json - to nie rozwiązało problemu
  2. Dodałem json do aplikacji internetowej za pomocą NuGet - rozwiązało to problem (pozwól mi zagłębić się w dlaczego):

Krok 2 polegał przede wszystkim na dodaniu informacji konfiguracyjnych dla json, które sugerują, że wszystkie projekty używają najnowszej wersji (6) bez względu na to, jaką mają wersję. Najprawdopodobniej poprawką jest dodanie powiązania zestawu do Web.Config.

Jednak krok 2 również wyczyścił starszy kod. Okazało się, że wcześniej używaliśmy starej wersji (5) json w naszej aplikacji internetowej, a foldery NuGet nie zostały usunięte, gdy odwołanie zostało (podejrzewam: ręcznie) usunięte. Dodanie najnowszego json (6), usunęło stare foldery (json v5). Może to być również częścią poprawki.

Nick Niebling
źródło
0

Veverke wspomniał, że można wyłączyć generowanie przekierowań powiązań, ustawiając AutoGEneratedBindingRedirects na false. Nie jestem pewien, czy to nowa rzecz od czasu opublikowania tego pytania, ale jest opcja „Pomiń stosowanie przekierowań wiązań” w Narzędziach / Opcje / Menedżer pakietów Nuget, którą można przełączać. Domyślnie jest wyłączone, co oznacza, że ​​przekierowania zostaną zastosowane. Jeśli jednak to zrobisz, będziesz musiał ręcznie zarządzać wszelkimi niezbędnymi przekierowaniami powiązań.

Svein Terje Gaup
źródło