Несоответствие версии сборки сборки 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)

Я весь день колотил головой об этих проблемах с зависимостями, я был бы очень признателен, если бы кто-то указал мне правильное направление.

Ответ 1

Найденное решение, попробуйте:

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

Ответ 2

Вы можете изменить конфигурацию привязки сборки и добавить перенаправление. См. Перенаправление версий сборки в 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>

EDIT

Зачем вам нужно перенаправлять версии сборки? Несмотря на то, что 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.

Ответ 3

Вышеуказанные решения верны, но есть еще один момент, который не следует забывать: содержимое 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) зависит от другого пакета.

enter image description here

Есть два варианта;

  1. Обновление (пакет Newtonsoft.JSON) последние версии.
  2. Обновите файл app.config с номерами версий.

И последний совет, если вы работаете с более чем одним проектом, например. exe-dll и проверьте обе версии, если есть Newtonsoft.JSON.

Ответ 4

Вставьте перенастройку сборки в приложение /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>

Обратите внимание, что номера версий должны соответствовать установленной версии.

Ответ 5

Имел эту же проблему.

Просто решил.

Это произошло после того, как NuGet был использован для установки Ext.NET, который имеет зависимость от Newtonsoft.JSON.
Уже был файл Newtonsoft.JSON.dll в /bin (и, очевидно, ссылка на него в файле web.config), без проверки. Я начал процедуру установки пакета NuGet во время отладки (так что файл, вероятно, имел блокировку).

В окне ошибки времени выполнения он расскажет вам о трассировке стека, в какой части манифеста возникла проблема, моя была основной версией, поэтому я проверил версию пакета установки. и это была 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>

Надеюсь, что это поможет

Ответ 6

В моем случае я удалил пакет с NuGet и установил новый. Затем удалите ссылку из списка и добавьте снова вручную. Работает как шарм. Надежда решится для вас.

Ответ 7

Недавно я работал над старым проектом. Мне нужно было обновить нашу версию 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>

Ответ 8

Получена ошибка выше: в Visual Studio 2013 Исправить: В пакете mamnager Execute: Install-package newtonsoft.json Это добавит новую строку в packages.config <package id="Newtonsoft.Json" version="6.0.5" targetFramework="net45" /> Удалите предыдущую строку, которая может указывать на предыдущую версию на packages.config. Удалите каталог старой версии в каталоге packagers. Удалите ссылку NewtonSoft.Json и прочитайте ее, указав на последнюю версию. У корневого webconfig будет следующее <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> как только все будет сделано. Закройте и откройте визуальную студию. Это должно исправить это. У меня была такая же ошибка при установке   PM > install-package durandal.starterkit Я использовал вышеупомянутый метод для исправления.

Ответ 9

Просто это произошло с TeamCity, и я думаю, что другие скоро это испытают. Вероятно, это относится к серверам сборки, которые вытаскивают пакеты NuGet.

Все ответы, которые говорят о необходимости перенаправления, верны. Однако вам необходимо определить правильный номер версии. Мой проект использовал Newtonsoft.Json 7.0, однако они только что выпустили 8.0, а TeamCity сбрасывал 8.0, что вызывало проблемы только на сервере, а не локально. Все мои перенаправления были установлены на 7.0.

Убедитесь, что развернутое приложение действительно получает правильную версию от NuGet, а не только самую последнюю и самую большую. Или обновите свой конфиг, чтобы указать на новейшую версию.

Ответ 10

Другие решения не спомогли мне. Хотя у меня был другой пакет nuget (Newtonsoft.Json.Schema version = 3.0.0.0).
Таким образом, мой проект был проектом ASP.NET, а пакет Newtonsoft.Json.Schama был включен в проект .NET Standard. Решением было просто добавить пакет Nuget в веб-проект (или запуск), и проблема исчезла.

Ответ 11

Я легко устранил эту проблему: я не скопировал файл конфигурации xml из папки компиляции.

Я просто убедился, что файл конфигурации xml также был включен вместе с моей программой, и все работало нормально!