Як я можу виправити конфлікти версії збірки з JSON.NET після оновлення посилань на пакет NuGet у новому проекті ASP.NET MVC 5?


89

Я створив новий веб-проект ASP.NET MVC 5 у VS 2013 (оновлення 1), а потім оновив усі пакети NuGet. Коли я будую проект, я отримую таке попередження:

попередження MSB3243: Неможливо вирішити конфлікт між "Newtonsoft.Json, Версія = 6.0.0.0, Культура = нейтральна, PublicKeyToken = 30ad4fe6b2a6aeed" та "Newtonsoft.Json, Версія = 4.5.0.0, Культура = нейтральна, PublicKeyToken = 30ad4fe6b2a6aeed".

Однак, коли я перевіряю web.config, я бачу, що перенаправлення на прив’язку є на місці:

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

Що саме те, що радить попередження.

Як я можу виправити це попередження?


Так, я зробив повну перебудову. Я також оновив NuGet до останньої версії, створив нове рішення і відтворив ту саму проблему.
Jim Lamb

Відповіді:


106

Ось кроки, які я використав для виправлення попередження:

  • Розвантажити проект у VS
  • Відредагуйте файл .csproj
  • Шукайте всі посилання на збірку Newtonsoft.Json
    • Знайдено два, один до v6 і один до v5
    • Замініть посилання на v5 на v6
  • Перезавантажити проект
  • Збірка та повідомлення про помилку збірки
  • Перегляньте посилання та переконайтеся, що зараз у Newtonsoft.Json є два. Видаліть той, який не вдалося вирішити.
  • Відновити - жодних попереджень

12
Я знайшов два посилання, одне для v6 і одне для v5, але я видалило (не замінило) одне з v5. Після цього у мене не виникало жодних проблем, таких як "збій посилань на збори" або два посилання на Newtonsoft.Json в інтерфейсі користувача. Я здогадуюсь, що хтось install.ps1
набився

Дякую за рішення. Я також видалив старіші посилання з файлу проекту і не мав проблем.
Чарльз Пракаш Дасарі

31
+1 - Це справді зводить мене з розуму, коли мені доводиться робити подібні речі. Ось чому я завжди вагаюся натискати оновлення в менеджері пакунків nuget.
hylander0

1
У мене виникла ця проблема, і я її виправив, видаливши зайве посилання, про яке я не підозрював. Це посилання на помилку Microsoft Connect, яка є основною причиною появи додаткового посилання: connect.microsoft.com/VisualStudio/feedback/details/816725/… .
Мартін Костелло,

1
У моєму випадку були посилання на дві різні версії Newtonsoft.Json 11.0.1 та 11.0.2, хоча він скаржився на версію 6.0.
Даніель Лобо,

31

У мене виникла ця проблема, оскільки я оновив пакети, які включали Microsoft.AspNet.WebApi, який має посилання на Newtonsoft.Json 4.5.6, і я вже встановив версію 6. Використовувати версію 6 було недостатньо розумно.

Щоб її вирішити, після оновлення WebApi я відкрив Інструменти> Менеджер пакунків NuGet> Консоль менеджера Pacakge і запустив:

 Update-Package Newtonsoft.Json

Журнал показав, що версії 6.0.x та 4.5.6 оновлено до останньої версії, і все було нормально.

У мене таке відчуття, що це знову з’явиться.


1
У моєму рішенні, яке містить кілька проектів, у мене була проблема з декількома різними версіями, це було повністю виправлено та оновлено до останньої версії JSON.net. Приємно!
c0d3p03t

1
Це було найпростіше, найпростіше рішення, яке вирішило мою проблему. Дякую!
youngrrrr

21

Я виявив, що цей розділ видалено з файлу проекту, щоб вирішити проблему.

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


Це воно. Припускаю, що жоден з Newtonsoft.Json.6.0.1 / 6.0.3 / 6.0.5 не відповідає перенаправленню прив'язки '' oldVersion = "0.0.0.0-6.0.0.0" '' Але я не знаю, як правильно написати
fantastory

Це була і моя проблема, я не впевнений, що це додало.
амнезія

Працював у мене. Помилка, пов’язана з конфліктом між версіями 6.0 та 12.0. Посилання на групу елементів було до версії 11.0. Тож не впевнений, що відбувається, але видалення групи елементів, здається, це вирішило, що стосується видалення помилки компіляції.
Брайан С.

13

Якщо нічого з перерахованого не працює, спробуйте використати це в web.config або 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>

Це найкраще підходить для ситуації, коли у вас є проект, який використовує вищу версію, і ви додаєте залежність, яка використовує стару версію того самого пакета, тому ви перенаправляєте стару версію на нову.
Ісмаїл Гавейл

13

Я перейшов з Newtonsoft.Json 11.0.1 на 12.0.2. Відкривши файл проекту в Notepad ++, я виявив обидва

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

і

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

Я видалив ItemGroup, обертаючи посилання шляхом підказки до версії 11.0.1.

Ці проблеми можуть бути шалено розчарованими. Більше того, розробники часто виконують ті самі дії, що й попередні налаштування проекту. Попередні налаштування не стикалися з проблемою. З якоїсь причини файл проекту час від часу оновлюється неправильно.

Я відчайдушно бажаю, щоб Microsoft виправила ці пекельні проблеми з візуальною студією, які не з’являлися. Це трапляється занадто часто і спричиняє зупинку прогресу, поки це не виправляється, часто методом спроб і помилок.


1
Саме в цьому була проблема. Дякую!
Джордж Фабіш,

8

Остаточне рішення помилок перенаправлення збірки

Гаразд, сподіваємось, це повинно допомогти усунути будь-які (розумні) розбіжності в посиланнях на збірку ...

  1. Перевірте помилку.

Зайдіть на веб-сайт

  1. Перевірте web.config після перенаправлення збірки. Створіть, якщо не існує.

Існуюче переспрямування збірки web.config

  1. Клацніть правою кнопкою миші посилання на збірку та виберіть Властивості.

Збірка у списку посилань, у відповідному проекті

  1. Перевірте Версію (не версію виконання) у таблиці Властивості. Скопіюй це.

Таблиця властивостей, що показує версію збірки

  1. Вставте в атрибут newVersion.

переспрямування збірки web.config з оновленою newVersion

  1. Для зручності змініть останню частину oldVersion на щось високе, кругле та уявне.

переспрямування збірки web.config з оновленою oldVersion

Радуйся.


Ця відповідь врятувала мені великий час! У мене була веб-програма, яка використовувала власну бібліотеку C #, обидва використовували один і той же пакет nuget, але веб-програма має стару версію, ніж бібліотека, і переспрямування не включало версію, яку використовувала бібліотека.
War Gravy

4

Пам'ятайте, що з перенаправленням прив'язки

oldVersion = "0.0.0.0-6.0.0.0"

Ви говорите, що старі версії dll знаходяться між версіями 0.0.0.0 та версією 6.0.0.0.


1
oldVersionнасправді тут трохи неправильно, ви говорите, що ваша збірка / exe була побудована з посиланням на версію в діапазоні, 0.0.0.0-6.0.0.0і що фактично встановлена (і бажана) версія є значенням під newVersion(стара версія буде краще сформульована як "очікувана версія" та нова версія були б краще сформульовані як "фактично доступна версія")
нічого не потрібно

2

Ніхто не згадав про таке, що, на мій погляд, є правильним рішенням:

Перейти до csproj проекту , на якому встановлений NuGet, і встановити AutoGEneratedBindingRedirectsв false.

<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>

Повна стаття в MSDN.


1

Я оновив свій пакет і навіть переінсталював його - але я все ще отримував точно таку ж помилку, як згаданий ОП. Я вручну відредагував dll, на який посилаються, виконавши наступне.

Я видалив newtonsoft.json.dll зі свого довідкового матеріалу, а потім вручну видалив .dll із директорії для сміття. Потім я вручну скопіював newtonsoft.json.dll із папки nuget-пакета до контейнера проекту, а потім додав посилання, переглянувши файл .dll.

Тепер мій проект будується знову.


0

У мене була подібна проблема, і я просто хотів опублікувати відповідь для інших у моїй ситуації.

У мене є рішення, що запускає веб-програму ASP.NET разом із багатьма іншими проектами бібліотек класу C #.

У моїй веб-програмі ASP.NET не використовувався json, а інші проекти, де.

Ось як я це виправив:

  1. Я переконався, що всі проекти, де використовується остання версія (6), використовуючи NuGet Update на всіх проектах, які зараз використовують будь-яку версію json - це не вирішило проблему
  2. Я додав json до веб-програми за допомогою NuGet - це вирішило проблему (дозвольте мені заглибитися в те, чому):

Крок 2 насамперед додав інформацію про конфігурацію для json, яка передбачає, що для всіх проектів використовується остання версія (6), незалежно від того, яку версію вони мають. Додавання прив’язки збірки до Web.Config, швидше за все, це виправлення.

Однак крок 2 також очистив застарілий код. Виявилося, що ми раніше використовували стару версію (5) json у нашому Веб-застосунку, і папки NuGet не були видалені, коли посилання було видалено (я підозрюю: вручну). Додавши останній json (6), видалили старі папки (json v5). Це також може бути частиною виправлення.


0

Веверке згадав, що можна відключити генерацію перенаправлення на прив'язку, встановивши для AutoGEneratedBindingRedirects значення false. Не впевнений, що це нова річ, оскільки це питання було опубліковано, але є опція "Пропустити застосування перенаправлення прив'язки" в Інструменти / Параметри / Менеджер пакетів Nuget, яку можна перемикати. За замовчуванням він вимкнений, тобто переспрямування застосовуватимуться. Однак якщо ви зробите це, вам доведеться керувати будь-якими необхідними перенаправленнями прив'язки вручну.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.