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

时间:2016-03-14 19:22:16

标签: json.net portable-class-library dotnet-httpclient typeloadexception

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

以下是设置以及我如何跟踪问题。

项目1 - Custom.WebApi(可移植,目标.net 4.5,Core 5.0,Win8,Xamarin.Android,Xamarin.iOS,Xamarin.iOS(经典))

这个项目是对HttpClient的抽象,用于统一Get,Post,Delete等的返回类型,并且仅依赖于Newtonsoft.Json和.NET以及此配置文件。

我们正在使用Newtsonsoft.Json pcl版本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项目中找到。这引用了一堆第三方的东西,还有 Newtonsoft.Json v 6.0.8完整($ packagesFolder \ Newtonsoft.Json.6.0.8 \ lib \ net45 \ Newtonsoft.Json.dll)

项目4 - MyWebsite.Tests

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

当我运行Project 4测试时,它们都会失败,表明该网站在Startup上有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在MyWebsite bin文件夹中。

为了使事情进一步复杂化,这种替换仅发生在某些情况下。如果我在没有调试的情况下启动,似乎不会一直发生,并且当dll没有被便携式版本替换时,执行单元测试会成功对抗部署。

1 个答案:

答案 0 :(得分:1)

您可以通过在PCL项目中的Newtonsoft.Json引用上将“Copy Local”设置为false来解决此问题。我明天会告诉你。