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.