Как исправить конфликт версии сборки с JSON.NET после обновления ссылок на пакеты NuGet в новом проекте ASP.NET MVC 5?

89

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

предупреждение MSB3243: невозможно разрешить конфликт между «Newtonsoft.Json, Version = 6.0.0.0, Culture = нейтральный, PublicKeyToken = 30ad4fe6b2a6aeed» и «Newtonsoft.Json, Version = 4.5.0.0, Culture = нейтральный, 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 до последней версии, создал новое решение и воспроизвел ту же проблему.
Джим Лэмб,

Ответы:

106

Вот шаги, которые я использовал, чтобы исправить предупреждение:

  • Выгрузить проект в VS
  • Отредактируйте файл .csproj
  • Искать все ссылки на сборку Newtonsoft.Json
    • Найдено два, один для v6 и один для v5
    • Заменить ссылку на v5 на v6
  • Перезагрузить проект
  • Сборка и уведомление об ошибке ссылки сборки
  • Просмотрите ссылки и увидите, что теперь их две на Newtonsoft.Json. Удалите тот, который не удается решить.
  • Восстановить - без предупреждений
Джим Лэмб
источник
12
Я нашел две ссылки, одну для v6 и одну для v5, но я удалил (не заменил) ссылку v5. После этого у меня не было никаких проблем вроде «сбой ссылки на сборку» или двух ссылок на Newtonsoft.Json в пользовательском интерфейсе. Я предполагаю, что кто-то чучелinstall.ps1
ta.speot.is
Спасибо за решение. Я тоже удалил старую ссылку из файла проекта, и проблем не было.
Чарльз Пракаш Дасари
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.
Daniel Lobo
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" '' Но я не знаю, как написать правильный
фантастика
Это тоже была моя проблема, я не уверен, что это добавило.
амнезия
Работал у меня. Ошибка, связанная с конфликтом между v6.0 и v12.0. Ссылка на группу элементов относится к версии 11.0. Так что не уверен, что происходит, но удаление группы элементов, похоже, решило ее, вплоть до удаления ошибки компиляции.
Brian.S
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>
ZeroDotNet
источник
Это лучше всего подходит для ситуации, когда у вас есть существующий проект, использующий более высокую версию, и вы добавляете зависимость, которая использует более старую версию того же пакета, поэтому вы перенаправляете старую версию на новую.
Исмаил Хавайел,
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 исправила эти адские проблемы с DLL Visual Studio, которые не появляются. Это происходит слишком часто, и прогресс останавливается до тех пор, пока не будет исправлен, часто методом проб и ошибок.

Джереми Рэй Браун
источник
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.

Veverke
источник
1

Я обновил свой пакет и даже переустановил его, но все равно получал ту же ошибку, что и упомянутый OP. Я вручную отредактировал указанную dll, выполнив следующие действия.

Я удалил newtonsoft.json.dll из своей ссылки, а затем вручную удалил .dll из директории bin. Затем я вручную скопировал 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. Не уверен, что это новая вещь с тех пор, как был опубликован этот вопрос, но есть опция «Пропустить применение перенаправления привязки» в Tools / Options / Nuget Packet Manager, которую можно переключать. По умолчанию он выключен, что означает, что будут применяться перенаправления. Однако, если вы это сделаете, вам придется вручную управлять всеми необходимыми перенаправлениями привязки.

Свейн Терье Гауп
источник