serialize serializar newtonsoft net jsonserializersettings jsonconvert example .net json.net versioning .net-assembly global-assembly-cache

serializar - Incompatibilidad de la versión de Newtonsoft Json.NET(infierno de DLL)



serializar json c# (1)

Newtonsoft.Json lanza versiones incompatibles con el mismo nombre seguro, solo cambia la versión del archivo.

Según MSDN :

Las asambleas que tienen el mismo nombre seguro deben ser idénticas.

Debido a esto, nuestra aplicación se rompe si otras aplicaciones, fuera de nuestro control, ponen una versión diferente de Newtonsoft.Json.dll en el GAC.

¿Hay alguna forma de forzar .NET para cargar una versión específica que necesitamos?

Actualizar:

Déjame explicarte el problema más a fondo:

En .NET, que yo sepa, no hay ningún mecanismo para resolver los ensamblajes antes de que el CLR intente resolverlos y falle.

Solo existe el evento AppDomain.AssemblyResolve y se activa solo cuando el ensamblaje no se resuelve. Por lo general es suficiente.

Pero en el caso de Newtonsoft.Json , no falla al resolver el ensamblaje sino que simplemente carga el incorrecto.

Esto sucede porque Newtonsoft.Json lanza versiones incompatibles con el mismo nombre seguro.

Ejemplo:

Digamos que nuestra aplicación compilada contra NJdll (versión de ensamblaje 1.0 , versión de archivo 1.0)

Luego, otra aplicación, coloque otra versión incompatible de la misma dll en el GAC NJdll (versión de ensamblaje 1.0 , versión de archivo 1.1 )

Debido a que solo cambian la versión del archivo y no cambian la versión del ensamblaje, estos dos ensamblajes tienen el mismo nombre seguro.

Entonces, para nuestra aplicación .NET que intenta resolver NJdll (versión de ensamblaje 1.0), ve el archivo DLL en GAC y lo carga. ( Porque .NET siempre prefiere el ensamblado desde GAC para el ensamblaje desde la carpeta "bin" )

Pero el montaje que cargó es incorrecto. Tiene versión de archivo 1.1 y no es compatible con la versión 1.0.

Dado que ambos conjuntos tienen la misma versión de ensamblaje, .NET no ve ninguna diferencia entre ellos. Pero cuando intenta resolver alguna clase o miembro, falla porque se modificó en la versión 1.1.

Y toda la aplicación falla con errores impredecibles.

Y lo peor es que incluso si mi aplicación no pone newtonsoft.json.dll en el GAC, alguna otra aplicación, fuera de mi control, pondrá una versión diferente de newtonsoft.json.dll en GAC: mi aplicación se romperá con impredecible excepciones

Entonces, mi pregunta es, ¿cómo puedo cargar primero el ensamblaje correcto, antes de que .NET cargue uno incorrecto?

Actualizar

https://github.com/JamesNK/Newtonsoft.Json/issues/615 https://github.com/JamesNK/Newtonsoft.Json/issues/1001

Los problemas con este problema se cerraron con comentarios que muestran que el autor de Newtonsoft.Json no entiende las versiones de .NET y por qué esto es importante.


El cargador de ensamblajes solo probará si faltan ensamblajes, es decir, ensamblajes que aún no están cargados. Si implementa la DLL en la carpeta de instalación de la aplicación y luego la carga explícitamente cuando se inicia la aplicación, entonces el cargador de ensamblajes no intentará volver a cargarla desde el GAC.

Puede cargar el ensamblaje explícitamente utilizando el método Assembly.LoadFrom .

Consulte https://msdn.microsoft.com/en-us/library/dd153782(v=vs.110).aspx para obtener más información.