为什么Json.NET需要System.Xml.Linq v5.0.5来序列化一个简单的对象?

jga*_*fin 23 c# json.net visual-studio-extensions .net-4.5.2 visual-studio-2015

我有以下对象:

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; }
}
Run Code Online (Sandbox Code Playgroud)

我尝试做一个简单的序列化(在VSIX项目中):

var settings = new ProjectInfo { ConnectionStringName = "SomeName" };
var json = JsonConvert.SerializeObject(settings);
Run Code Online (Sandbox Code Playgroud)

这给了我:

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.
Run Code Online (Sandbox Code Playgroud)

我花了最后一小时试图找出依赖关系的来源或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)
Run Code Online (Sandbox Code Playgroud)

..但为什么要采取这条路线?

更新

一个简单的测试用例也失败了:

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

更新2

这个项目以前工作过.它也适用于同事的计算机.我能看到的唯一区别是我已升级到VStudio 2015 Update 1.(或者我在某处犯了一个愚蠢的错误).但我也对我的同事使用的最新修订版进行了重新设置.

为什么它试图引用System.Linq.Xml的v5.0.5?v4.0.0不是.NET 4.5的标准版吗?v5.0.5属于哪个版本的.NET?

(我之前从未遇到类似Json.NET的问题.它是否与VStudio 2015/.NET 4.5.2/VSIX项目有关?)

UPDATE3

这是依赖项.他们表明Json.NET试图引用那个确切的版本:

在此输入图像描述

更新:

项目文件中的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>
Run Code Online (Sandbox Code Playgroud)

编辑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>
Run Code Online (Sandbox Code Playgroud)

Tim*_*lez 2

Json.NET 使用 System.Xml.Linq 将 json 转换为 xml。

只要您不引用依赖项中的任何类型,您就能够在没有库依赖项的情况下进行编译。这个是正常的。我对 NHibernate 的 Iesi.Collections 依赖也有同样的问题。

我查看了 Json.Net 源代码,System.Xml.Linq 的 using 语句针对 .Net 版本进行了条件化。您和您的同事运行相同的 .Net 版本吗?您最近是否更改了计算机上的.Net?

我的建议是完全删除 NHibernate 和任何依赖项。然后使用 NuGet 安装 Json.Net。NuGet 将自动添加所有依赖项并执行任何所需的程序集绑定重定向。

即使您不想使用 NuGet,也可以运行 diff 并查看它所做的更改,以便您可以进行相同的操作。