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

C# 为什么Json.NET需要System.Xml.Linq v5.0.5来序列化简单对象?,c#,json.net,visual-studio-2015,visual-studio-extensions,.net-4.5.2,C#,Json.net,Visual Studio 2015,Visual Studio Extensions,.net 4.5.2,我的目标如下: public class ProjectInfo { public string ConnectionStringName { get; set; } public string DefaultEntityNamespace { get; set; } public string DefaultSharedNamespace { get; set; } public string DefaultTestNamespace { get; set; }

我的目标如下:

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项目中):

这给了我:

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。(或者我在某处犯了一个愚蠢的错误)。但我也对我同事使用的最新版本进行了硬重置

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

(我以前从未在Json.NET上遇到过类似的问题。这是否与VStudio 2015/.NET 4.5.2/VSIX项目有关?)

更新3

这里是依赖项。它们表明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>

..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll
真的
编辑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>

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,看看它做了哪些更改,这样您就可以进行相同的更改。

您能展示一个简短但完整的程序来演示这个问题吗?设置中有什么?我怀疑控制台应用程序正在从GAC加载依赖项,而vsix项目没有这样做。Newtonsoft确实依赖它。好的,我可以告诉您,
XmlNodeConverter
是内置转换器之一,它在使用默认契约解析器反序列化的每个对象上进行测试。您可以在
内置转换器
数组中看到它。这不适用于
PORTABLE40
,但除此之外,它总是会被击中。因此,您必须能够引用它的依赖项。(该数组作为调用
GetMatchingConverter
的第一个参数传递,可以在堆栈跟踪中看到。)在vsix项目中添加对
System.Xml.Linq
的引用有什么问题?添加项目引用后,能否共享项目文件(仅此文件)?告诉我你从NuGet软件包中取错了资产。。。
<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>