Подтвердить что ты не робот

Почему Json.NET требует System.Xml.Linq v5.0.5 для сериализации простого объекта?

У меня есть следующий объект:

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; }
}

Я пытаюсь сделать простую сериализацию (в проекте VSIX):

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

который дает мне:

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.

Я потратил последний час, пытаясь выяснить, откуда происходит зависимость, или почему Json.NET пытается использовать это пространство имен. System.Xml.Linq не ссылается ни на один из моих проектов.

Из трассировки стека я вижу:

   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)

.. но почему он берет этот маршрут?

Обновление

Простой тестовый пример также терпит неудачу:

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

Обновление 2

Этот проект уже работал. Он также работает на компьютере коллеги. Единственное различие, которое я вижу, это то, что я обновил до VStudio 2015 Обновление 1. (или что я сделал глупую ошибку где-то). Но я также сделал жесткий reset до последней версии, которую использует мой коллега.

Почему он пытается ссылаться на v5.0.5 из System.Linq.Xml? Не является ли v4.0.0 стандартным для .NET 4.5? Какая версия .NET для v5.0.5 принадлежит?

(Раньше у меня никогда не было аналогичной проблемы с Json.NET. Это что-то с проектом VStudio 2015/.NET 4.5.2/VSIX?)

Update3

Вот зависимости. Они показывают, что Json.NET пытается ссылаться на эту точную версию:

введите описание изображения здесь

Update:

Ссылка Json.NET в файле проекта:

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

Изменить 4:

Моя проблема в том, что расширение не работает, поскольку оно пытается загрузить сборку, которая не существует. По моему мнению, v5.0.5 является сборкой silverlight. И я не использую Silverlight.

Я попытался добавить перенаправление сборки, но он не работает.

<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>
4b9b3361

Ответ 1

Json.NET использует System.Xml.Linq для преобразования json в xml.

Вы сможете скомпилировать без зависимостей библиотеки, если вы не ссылаетесь ни на один из типов в зависимостях. Это нормально. У меня была такая же проблема с зависимостью NHibernate Iesi.Collections.

Я посмотрел в исходном коде Json.Net, а операторы using для System.Xml.Linq условно для версии .Net. Вы и ваш коллега используете ту же версию .Net? Вы недавно изменили .Net на своей машине?

Я бы предложил полностью удалить NHibernate и любые зависимости. Затем установите Json.Net с помощью NuGet. NuGet автоматически добавит все зависимости и выполнит любые необходимые перенаправления связывания сборки.

Даже если вы не хотите использовать NuGet, запустите diff и посмотрите, какие изменения он внесет, чтобы вы могли сделать то же самое.