System.TypeLoadException: правила безопасности наследования нарушены типом: «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 для унификации возвращаемых типов 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 full ($packagesFolder\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll)

Проект 4 — MyWebsite.Tests

Для тестирования веб-проекта у меня есть тестовый проект, который вызывает конечные точки с помощью реализации Custom.WebApi. Этот проект также ссылается на newtonsoft.json версии 6.0.8. Однако эта ссылка предназначена исключительно для исправления ошибок, наблюдаемых при запуске. Ничто в этом проекте не зависит от Newtonsoft.Json, но если я не добавлю ссылку на него явным образом, произойдет сбой TypeLoadException. Добавление ссылки, похоже, помогает далеко.

Когда я запускаю тесты Project 4, все они терпят неудачу, что указывает на то, что на веб-сайте возникает исключение TypeLoadException при запуске. После тонны расследования я заметил, что при сборке проекта MyWebsite файл Newtonsoft.Json.dll в папке bin перезаписывается переносимой версией и дает сбой.

Если я изменю тестовый проект, чтобы он ссылался на тот же переносимый файл newtonsoft.json.dll, тестовый проект завершится с той же ошибкой. При использовании полной версии ошибок не наблюдается.

Если я вручную заменю dll в папке bin MyWebsite, она снова перезапишется при сборке. Я убедился, что ссылки в файле 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. папка бин.

Что еще больше усложняет ситуацию, эта замена происходит ИНОГДА. Если я начинаю без отладки, кажется, что это происходит не всегда, и выполнение модульных тестов завершается успешно против развертывания, когда dll не заменяется переносимой версией.


person MPavlak    schedule 14.03.2016    source источник


Ответы (1)


Вы можете решить эту проблему, задав для параметра «Копировать локально» значение false в ссылке Newtonsoft.Json в ваших проектах PCL. Я покажу тебе завтра.

person RJ Cuthbertson    schedule 17.03.2016