Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Newtonsoft.json assembly package version mismatch

I am trying to use SocketIO4Net to create socket.io client in .net. Itseems SocketIO4Net has a dependency of Newtonsoft.Json >= 4.0.8. I also am using PushSharp library which has a Newtonsoft.Json dependency of >= 4.5.10. I got NewtonSoft.Json 4.5.11 when i first installed PushSharp and I thought this version should support SocketIO4Net as well since its a higher version but i get this error whenever am trying to connect to socket.io server.

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)

I have been banging my head all day with these dependency issues, I would be very grateful if someone can point me in the right direction.

like image 414
Bitsian Avatar asked Jun 21 '13 13:06

Bitsian


2 Answers

Found solution, try with:

<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> 
like image 111
ZeroDotNet Avatar answered Oct 12 '22 04:10

ZeroDotNet


You can modify assembly-binding configuration and add a redirect. See Redirecting Assembly Versions on MSDN.

Basically you want to add following snippet to your app.config or web.config file:

<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

Why do you need to redirect assembly versions? Even though SocketIO4Net supports newer versions of Newtonsoft.Json, it was compiled against a single version (4.0.8 in your case). This version is stored in the DLL and it is used to load DLLs SocketIO4Net depends on.

Note that NuGet dependencies are not the same as DLL/runtime dependencies - NuGet dependency on Newtonsoft.Json >= 4.0.8 only means that you will be allowed to install SocektIO4Net into a project that has a newer version of Newtonsoft.Json, it has nothing to do with runtime settings.

That being said, recent NuGet versions should add assembly-binding-redirects automatically for you if your project has app.config or web.config file.

like image 29
Miroslav Bajtoš Avatar answered Oct 12 '22 02:10

Miroslav Bajtoš