2013-06-21 4 views
15

Я пытаюсь использовать SocketIO4Net для создания клиента socket.io в .net. Itseems SocketIO4Net имеет зависимость от Newtonsoft.Json> = 4.0.8. Я также использую библиотеку PushSharp, у которой есть зависимость Newtonsoft.Json от> = 4.5.10. Я получил NewtonSoft.Json 4.5.11, когда я впервые установил PushSharp, и я думал, что эта версия должна поддерживать SocketIO4Net, а также с более высокой версией, но я получаю эту ошибку всякий раз, когда пытаюсь подключиться к серверу socket.io.Newtonsoft.json сборка версия версии несоответствие

Could not load file or assembly 'Newtonsoft.Json, Version=4.0.8.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

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

+0

FYI, мы также пришли через это, с точно такой же версии Newtonsoft.Json. В нашем случае именно PlainElastic.NET привнесла старую версию 4.0.8. Возможно, есть некоторая несогласованность в версиях Newtonsoft.Json, которые хранятся в NuGet ...? –

ответ

1

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

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

+0

Когда я помещаю этот код в свой рабочий стол App.Config, символы не загружаются, и я получаю сообщение об ошибке «Microsoft.ServiceBus.pdb не загружен». Я не уверен, почему это произойдет, когда я сделаю вышеуказанную сборку перенаправленной. Это не происходит, когда я удаляю re direct. Есть идеи? – Bitsian

+0

И мне было интересно, не нужно ли мне переходить с 4.0.8 до 4.5.11? Я вижу 4.5.11 как в старой, так и в новой версиях в коде ur? – Bitsian

4

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

+0

Когда я помещаю этот код в свой App.Config рабочей роли, символы не загружаются, и я получаю сообщение об ошибке «Microsoft.ServiceBus.pdb не загружен». Я не уверен, почему это произойдет, когда я сделаю вышеуказанную сборку перенаправленной. Это не происходит, когда я удаляю re direct. Есть идеи? – Bitsian

+0

И мне было интересно, не нужно ли мне переходить с 4.0.8 до 4.5.11? Я вижу 4.5.11 как в старой, так и в новой версиях в коде ur? – Bitsian

+0

@Bitsian Я не знаю, что может быть причиной того, что «Microsoft.ServiceBus.pdb не загружен». Вероятно, еще одна ошибка, которая раньше была скрыта ошибкой привязки сборки. –

18

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

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

Это исправление для текущего пакета 6.0.8 json.net .... –

0

Получили выше Ошибка: в Visual Studio 2013 исправить: В пакете mamnager Execute: Install-пакет newtonsoft.json Это добавит новую строку в пакетах .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 Я использовал вышеупомянутый метод для исправления.

-1

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

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

1

Если бы этот же выпуск.

Просто разрешил это.

Это произошло после того, как 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> 

Надеется, что это помогает

0

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

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

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

1

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

0

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

Согласно http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx «Вы не можете перенаправлять версии для сборок которые не имеют сильного имени. Общая среда исполнения в языке игнорирует версию для сборок, которые не имеют сильного имени ». – PaulBinder

0

Вышеуказанные решения являются правильными, но есть еще один момент, который не следует забывать: 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. Update (Newtonsoft.JSON пакет) последние версии.
  2. Обновление Файл app.config в номерах версий.

And last advice, if you are working with more than one project, eg. exe-dll and check both versions if there is Newtonsoft.JSON.