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?
Odpowiedzi:
Oto kroki, które zastosowałem, aby naprawić ostrzeżenie:
źródło
install.ps1
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.
źródło
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>
źródło
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>
źródło
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.
źródło
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 ...
Cieszyć.
źródło
Pamiętaj o tym przy przekierowaniu wiązania
Mówisz, że stare wersje biblioteki dll znajdują się między wersją 0.0.0.0 a wersją 6.0.0.0.
źródło
oldVersion
jest tutaj trochę myląca, mówisz, że twój zestaw / plik exe został zbudowany z odniesieniem do wersji z zakresu0.0.0.0-6.0.0.0
i że faktycznie zainstalowana (i preferowana) wersja to wartość podnewVersion
(stara wersja byłaby lepiej sformułowana jako „oczekiwana wersja”, a nowa wersja będzie lepiej sformułowana jako „rzeczywista dostępna wersja”)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
AutoGEneratedBindingRedirects
sięfalse
.<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>
Pełny artykuł w MSDN.
źródło
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.
źródło
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:
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.
źródło
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ń.
źródło