c# json.net visual-studio-2015 visual-studio-extensions .net-4.5.2

c# - ¿Por qué Json.NET requiere System.Xml.Linq v5.0.5 para la serialización de un objeto simple?



visual-studio-2015 visual-studio-extensions (1)

Tengo el siguiente objeto:

public class ProjectInfo { public string ConnectionStringName { get; set; } public string DefaultEntityNamespace { get; set; } public string DefaultSharedNamespace { get; set; } public string DefaultTestNamespace { get; set; } public string SqlProviderName { get; set; } }

Lo cual intento hacer una serialización simple de (en un proyecto VSIX):

var settings = new ProjectInfo { ConnectionStringName = "SomeName" }; var json = JsonConvert.SerializeObject(settings);

que me da:

An exception of type ''System.IO.FileNotFoundException'' occurred in Newtonsoft.Json.dll but was not handled in user code Additional information: Could not load file or assembly ''System.Xml.Linq, Version=5.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'' or one of its dependencies. The system cannot find the file specified.

Pasé la última hora tratando de descubrir de dónde viene la dependencia o por qué Json.NET intenta usar ese espacio de nombres. System.Xml.Linq no se referencia en ninguno de mis proyectos.

Desde el rastro de la pila puedo ver:

at Newtonsoft.Json.Converters.XmlNodeConverter.CanConvert(Type valueType) at Newtonsoft.Json.JsonSerializer.GetMatchingConverter(IList`1 converters, Type objectType) at Newtonsoft.Json.Serialization.DefaultContractResolver.InitializeContract(JsonContract contract) at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateObjectContract(Type objectType) at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateContract(Type objectType) at Newtonsoft.Json.Serialization.DefaultContractResolver.ResolveContract(Type type) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType) at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType) at Newtonsoft.Json.JsonConvert.SerializeObjectInternal(Object value, Type type, JsonSerializer jsonSerializer) at Newtonsoft.Json.JsonConvert.SerializeObject(Object value)

..pero ¿por qué toma esa ruta?

Actualizar

Un caso de prueba simple también falla:

[Fact] public void should_be_Able_to_Serialize_settings() { JsonConvert.SerializeObject(new ProjectInfo {ConnectionStringName = "Arne"}); }

Actualización 2

Este proyecto ha funcionado antes. También funciona en la computadora de un colega. La única diferencia que puedo ver es que me actualicé a VStudio 2015 Actualización 1 . ( o que cometí un error tonto en alguna parte ). Pero también hice un restablecimiento completo a la última revisión que usa mi colega.

¿Por qué intenta hacer referencia a v5.0.5 de System.Linq.Xml? ¿No es el v4.0.0 el estándar para .NET 4.5? ¿A qué versión de .NET pertenece v5.0.5?

(Nunca antes había tenido un problema similar con Json.NET. ¿Es algo con el proyecto VStudio 2015 / .NET 4.5.2 / VSIX?)

Actualización3

Aquí están las dependencias. Muestran que Json.NET intenta hacer referencia a esa versión exacta:

Actualizar:

Referencia de Json.NET en el archivo de proyecto:

<Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=c70b2336aed9f731, processorArchitecture=MSIL"> <HintPath>../packages/Newtonsoft.Json.7.0.1/lib/net45/Newtonsoft.Json.dll</HintPath> <Private>True</Private> </Reference>

Editar 4:

Mi problema es que la extensión no funciona ya que intenta cargar un ensamblaje que no existe. Desde mi entendimiento, v5.0.5 es un ensamblaje Silverlight. Y no uso Silverlight.

Intenté agregar una redirección de ensamblaje, pero parece que no funciona.

<dependentAssembly> <assemblyIdentity name="System.Xml.Linq" publicKeyToken="31bf3856ad364e35" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-5.0.5.0" newVersion="4.0.0.0"/> </dependentAssembly>


Json.NET utiliza System.Xml.Linq para convertir json a xml.

Podrá compilar sin las dependencias de una biblioteca, siempre que no haga referencia a ninguno de los tipos en las dependencias. Esto es normal. He tenido el mismo problema con la dependencia Iesi.Collections de NHibernate.

Busqué en el código fuente de Json.Net y las instrucciones de uso de System.Xml.Linq están condicionadas para la versión .Net. ¿Usted y su colega ejecutan la misma versión .Net? ¿Cambió recientemente .Net en su máquina?

Lo que sugeriría es eliminar completamente NHibernate y cualquier dependencia. Luego instala Json.Net con NuGet. NuGet agregará automáticamente todas las dependencias y realizará las redirecciones de enlace de ensamblaje necesarias.

Incluso si no quiere usar NuGet, ejecute un diff y vea qué cambios hace para que pueda hacer lo mismo.