我有一个包含两个组件的解决方案:
- .NET 4.5 控制台应用程序 (
A
)。 - 使用Newtonsoft Json.NET 的PCL库(
B
)。
只要只有B
使用并引用Json.NET
(作为 NuGet 包),一切正常。但是一旦我从 A
中添加对相同 NuGet 包的引用,我就会一直得到:
System.TypeLoadException: Could not load type 'Newtonsoft.Json.SerializationBinder' ...
我追踪了由NuGet引起的问题,包括两个不同版本的Json.NET
程序集:
A
使用的那个将文件描述设置为 Json.NETB
使用的那个将文件描述设置为 Json.NET 可移植
显然,一个组件不能被另一个组件取代。我的 PCL 不再找到它期望的版本,因此出现异常。
如何配置 NuGet,以便两个项目引用相同的可移植版本Json.NET
?
我找到了一种解决方法,以确保B
和A
都引用同一个 Json.NET 便携式程序集。
默认情况下,NuGet 将<HintPath>
配置为设置为库的net45
版本:
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..packagesNewtonsoft.Json.6.0.6libnet45Newtonsoft.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>..packagesNewtonsoft.Json.6.0.6libportable-net45+wp80+win8+wpa81+aspnetcore50Newtonsoft.Json.dll</HintPath>
</Reference>
有了这个,A
和B
都将使用完全相同的程序集。