Несоответствие версии пакета сборки Newtonsoft.json
Я пытаюсь использовать SocketIO4Net для создания клиента socket.io в.net. Это значит, что SocketIO4Net имеет зависимость Newtonsoft.Json >= 4.0.8. Я также использую библиотеку PushSharp, которая имеет зависимость Newtonsoft.Json>= 4.5.10. Я получил NewtonSoft.Json 4.5.11, когда впервые установил PushSharp, и я подумал, что эта версия должна поддерживать SocketIO4Net, так как это более высокая версия, но я получаю эту ошибку всякий раз, когда пытаюсь подключиться к серверу socket.io.
Не удалось загрузить файл или сборку 'Newtonsoft.Json, версия =4.0.8.0, культура = нейтральная, PublicKeyToken=30ad4fe6b2a6aeed' или одна из ее зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)
Я весь день колотил головой об этих проблемах с зависимостями, я был бы очень признателен, если бы кто-то указал мне правильное направление.
10 ответов
Найденное решение, попробуйте с:
<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>
Вы можете изменить конфигурацию привязки сборки и добавить перенаправление. См. Перенаправление версий сборки на MSDN.
В основном вы хотите добавить следующий фрагмент к вашему app.config
или же web.config
файл:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json"
publicKeyToken="30ad4fe6b2a6aeed"
culture="neutral" />
<!--
Assembly versions can be redirected in application,
publisher policy, or machine configuration files.
-->
<bindingRedirect oldVersion="1.0.0.0-4.5.11.0" newVersion="4.5.11.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
РЕДАКТИРОВАТЬ
Зачем вам нужно перенаправлять версии сборки? Несмотря на то, что SocketIO4Net поддерживает более новые версии Newtonsoft.Json, он был скомпилирован для одной версии (4.0.8 в вашем случае). Эта версия хранится в DLL и используется для загрузки библиотек DLL, от которых зависит SocketIO4Net.
Обратите внимание, что зависимости NuGet не совпадают с зависимостями DLL/ среды выполнения - зависимость NuGet от Newtonsoft.Json >= 4.0.8 означает только то, что вам будет разрешено установить SocektIO4Net в проект, который имеет более новую версию Newtonsoft.Json, он имеет не имеет ничего общего с настройками времени выполнения.
Тем не менее, последние версии NuGet должны автоматически добавлять перенаправления сборки-привязки-перенаправления, если в вашем проекте есть файл app.config или web.config.
Вышеуказанные решения верны, но есть еще один момент, который не следует забывать: содержимое app.config было таким же, как и вышеупомянутые решения.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Но это хорошая идея, чтобы проверить, если это актуально. В моем случае Newtonsoft.JSON (v.6.0.4) зависел от другого пакета.
Есть два варианта;
- Обновление (пакет Newtonsoft.JSON) последних версий.
- Обновите файл app.config в номерах версий.
И последний совет, если вы работаете с более чем одним проектом, например. exe-dll и проверьте обе версии, если есть Newtonsoft.JSON.
Была такая же проблема.
Просто решил это.
Это произошло после того, как NuGet был использован для установки Ext.NET, которая зависит от Newtonsoft.JSON.
Уже был файл Newtonsoft.JSON.dll в папке /bin (и, очевидно, ссылка на него в файле web.config) без проверки. Я запустил процедуру NuGet Package-Install во время отладки (поэтому файл, вероятно, имел блокировку).
В окне ошибки времени выполнения он сообщит вам по трассировке стека, с какой частью манифеста у него возникла проблема, у меня была основная версия, поэтому я проверил версию установочного пакета. и это была 1 основная версия. Нашел оригинальный файл NuGet по адресу: "[физический путь]/../packages/Newtonsoft.Json.[Версия]/lib/[.NET version]/"
И Манифест, и Библиотека были там, поэтому скопировали его в папку / bin, обновили информацию о сборке корневого web.config, и это сработало.
Примеры кода: до
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
После
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="7.0.0.0" />
</dependentAssembly>
Надеюсь это поможет
Я недавно работал над старым проектом. Мне нужно было обновить наш Newtonsoft.Json.dll, так как мне пришлось использовать "новый" API, который требовал более новой версии, но у меня все еще были другие библиотеки DLL, которые требовали старой версии.
bindingRedirect вы говорите? Нету. Он продолжал жаловаться на несоответствие манифеста.
Отдельные теги codeBase? Нету. Он продолжал жаловаться на несоответствие манифеста.
Проблема, по-видимому, заключалась в том, что старая версия Newtonsoft.Json.dll (3.0.0.0) НЕ имеет PublicKeyToken, но в "новой" версии (4.5.7.1) есть PublicKeyToken. Поэтому они не могут использовать один и тот же зависимый тег сборки.
Вот чем я закончил:
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="" culture="neutral"/>
<codeBase version="3.0.0.0" href="bin\Newtonsoft_Old\Newtonsoft.Json.dll" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
<codeBase version="4.5.0.0" href="bin\Newtonsoft.Json.dll" />
</dependentAssembly>
Поместите перенаправление сборки в ваше приложение /web.config;
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" PublicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="1.0.0.0-4.5.11.0" newVersion="4.5.11.0" />
</dependentAssembly>
Обратите внимание, что номера версий должны соответствовать версии, которую вы установили.
В моем случае я удалил пакет с NuGet и установил новый. Затем удалите ссылку из списка ссылок и добавьте снова вручную. Работает как шарм. Надеюсь решить для вас.
Получил вышеуказанную ошибку: в Visual Studio 2013 исправить: в пакете mamnager выполнить: Install-package newtonsoft.json Это добавит новую строку в packages.config<package id="Newtonsoft.Json" version="6.0.5" targetFramework="net45" />
Удалите предыдущую строку, которая может указывать на предыдущую версию файла packages.config. Удалите каталог старой версии в каталоге упаковщиков. Удалите ссылку на NewtonSoft.Json и прочитайте ее, указав на последнюю версию. Корневой webconfig будет иметь следующее<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
как только все будет сделано. Закройте и снова откройте визуальную студию. Это должно это исправить. У меня была такая же ошибка при установке PM> install-package durandal.starterkit, который я использовал вышеупомянутым методом, чтобы исправить.
Только что это случилось с TeamCity, и я думаю, что другие скоро испытают это. Это, вероятно, относится к большинству серверов сборки, которые получают пакеты NuGet.
Все ответы, которые говорят, чтобы сделать перенаправления, являются правильными. Однако вам все равно нужно определить правильный номер версии. Мой проект использовал Newtonsoft.Json 7.0
Однако они только что выпустили 8.0
и TeamCity рушится 8.0
который вызывал проблемы только на сервере, а не локально. Все мои перенаправления были установлены на 7.0
,
Убедитесь, что развернутое приложение действительно получает правильную версию от NuGet, а не только последнюю и лучшую. Или обновите ваш конфиг, чтобы он указывал на самую новую версию.
Другие решения у меня не работали. Хотя у меня был другой пакет nuget (Newtonsoft.Json.Schema version=3.0.0.0).
Итак, мой проект был проектом ASP .NET, а пакет Newtonsoft.Json.Schama упоминался в проекте.NET Standard. Решением было просто добавить пакет Nuget в веб-проект (или проект запуска), и проблема исчезла.
Я легко исправил эту проблему: я не скопировал файл конфигурации xml из папки компиляции.
Я просто позаботился о том, чтобы файл конфигурации xml был включен вместе с моей программой, и все работало нормально!