System.TypeLoadException:类型违反的继承安全规则:'System.Net.Http.Formatting.JsonContractResolver'

System.TypeLoadException: Inheritance security rules violated by type: 'System.Net.Http.Formatting.JsonContractResolver'

我收到一个非常烦人的错误,关于 System.Net.Http.Formatting.JsonContractResolver 在使用 PCL 的项目中违反了继承安全规则。

这是设置以及我如何找到问题的。

项目 1 - Custom.WebApi(便携,针对 .net 4.5、Core 5.0、Win8,Xamarin.Android、Xamarin.iOS、Xamarin.iOS(经典))

此项目是对 HttpClient 的抽象,以统一 return 类型的 Get、Post、Delete...,并且仅依赖于 Newtonsoft.Json 和具有此配置文件的 .NET .

我们使用的是Newtsonsoft.Jsonpcl版本6.0.8.($packagesFolder\Newtonsoft.Json.6.0.8\lib\portable-net40+sl5+wp80+win8+ wpa81\Newtonsoft.Json.dll)

项目 2 - Custom.WepApi.Tests(单元测试项目)

这是WebApi项目的测试项目。它引用了 6.0.8 的完整版本 ($packagesFolder\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll)

这个项目能够运行针对WebApi项目进行测试没问题。

项目 3 - MyWebsite(ASP.NET WebApi 站点)

本项目为统一响应类型的WebApi项目,在Custom.WebApi项目中找到。这引用了一堆第 3 方的东西,还有 Newtonsoft.Json v 6.0.8 full ($packagesFolder\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll)

项目 4 - MyWebsite.Tests

为了测试 Web 项目,我有一个使用 Custom.WebApi 实现调用端点的测试项目。该项目还引用了 newtonsoft.json 版本 6.0.8。但是,此引用纯粹是为了修复 运行ning 时观察到的错误。 此项目中没有任何内容依赖于 Newtonsoft.Json,但如果我不显式添加对它的引用,它将因 TypeLoadException 而失败。添加引用似乎可以解决这个问题。

当我 运行 项目 4 测试时,它们都失败了,表明该网站在启动时出现 TypeLoadException。经过大量调查后,我注意到在构建 MyWebsite 项目时,bin 文件夹中的 Newtonsoft.Json.dll 被便携版本覆盖并失败。

如果我更改测试项目以引用相同的可移植 newtonsoft.json.dll,测试项目将失败并出现相同的错误。使用完整版,没有观察到错误。

如果我手动替换MyWebsite bin 文件夹中的dll,它会在构建时再次被覆盖。我已确保 MyWebsite .csproj 文件中的引用正确无误,包括提示路径。

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

所以,要么我需要解决为什么它认为存在继承安全规则违规(查看源代码没有发现任何明显的访问修饰符不匹配),要么它需要停止覆盖 Newtonsoft.Json.dll 在我的网站 bin 文件夹中。

更复杂的是,这种替换只是偶尔发生。如果我开始时不调试,它似乎不会一直发生,并且当 dll 未替换为可移植版本时,执行单元测试会成功部署。

您可以通过将 PCL 项目中的 Newtonsoft.Json 引用的 "Copy Local" 设置为 false 来解决此问题。明天给你看。