c# - Json.NET 初始化抛出 System.TypeLoadException

标签 c# .net json.net nuget

我有一个包含两个组件的解决方案:

  • .NET 4.5 控制台应用程序 (A)。
  • 使用 Newtonsoft 的 Json.NET (B) 的 PCL 库。

只要只有 B 使用并引用 Json.NET(作为 NuGet 包),一切都会正常工作。但是,一旦我添加对 A 中同一个 NuGet 包的引用,我就会始终得到:

System.TypeLoadException:无法加载类型“Newtonsoft.Json.SerializationBinder”...

我找到了由 NuGet 引起的问题,包括两个不同版本的 Json.NET 程序集:

  • A 使用的文件描述设置为 Json.NET
  • B 使用的文件描述设置为Json.NET Portable

显然,一个组件不能被另一个组件替换。我的 PCL 不再找到它期望的版本,因此出现异常。

如何配置 NuGet,以便两个项目引用相同的 Json.NET可移植版本?

最佳答案

我找到了一种解决方法来确保 BA引用相同的Json.NET Portable程序集。

默认情况下,NuGet 配置了 <HintPath>设置为net45库版本:

<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\packages\Newtonsoft.Json.6.0.6\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>

这是这场冲突的根源。因此编辑A.csproj文件改为:

<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\packages\Newtonsoft.Json.6.0.6\lib\portable-net45+wp80+win8+wpa81+aspnetcore50\Newtonsoft.Json.dll</HintPath>
</Reference>

完成后,A 将使用完全相同的程序集。和B .

关于c# - Json.NET 初始化抛出 System.TypeLoadException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26987596/

相关文章:

c# - 使用 Newtonsoft JSON 的 ObjectCreationHandling 的说明?

c# - 如何将整数反序列化为 int,而不是 long?

c# - wp7 芒果中的 DataTemplateSelector

.net - 为 .NET 选择依赖注入(inject)框架时应该考虑什么

c# - 是否可以使用 extern 和 override 修饰符指定一个函数?

.net - SqlCommand.CommandTimeout 和 SqlConnection.ConnectionTimeout 之间有什么区别?

c# - 从 JSON 反序列化大量属性

c# - 如何在 c# 程序中连续运行函数

c# - 按位检查和相等检查哪个更有效?

c# - 类继承、扩展和实现 oops 之间的区别