C#: несовместимость NancyFx и Newtonsoft.Json в одном strongly signed проекте
Господа.
Я встретился со странной ситуацией.
Работаю в WinForms - проекте на NET Framework 4.7.2.
- Использую фреймворк NancyFx - "lightweight, low-ceremony, framework for building HTTP based services on .NET Framework/Core and Mono". В общем, это такая штука, которая позволяет в несколько строк встроить в своё приложение HTTP - сервер, в который можно добавить роуты и научить его отвечать на GET и POST запросы.
Устанавливается в проект командой NuGet
Install-Package Nancy.Hosting.Self
Еще одним используемым компонентом является Newtonsoft.Json - тоже достаточно хорошо известная штука.
Устанавливается в проект командой NuGet
Install-Package Newtonsoft.Json
- И всё идёт прекрасно.
До того момента, когда я пытаюсь выкатить своё решение в production.
Тогда на строке даже не создания, а только ОБЪЯВЛЕНИЯ переменной NancyHost nancyHost = null; я получаю в момент запуска приложения ошибку Could not load file or assembly 'Nancy.Hosting.Self, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. A strongly-named assembly is required
Смотрю - да, проект, который я выкатываю в продакшен, имеет строгую подпись - см.
.
Создаю тестовый проект - простое WinForm приложение с одним окном, куда добавляю эти две зависимости. Мой packages.config выглядит вот так:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Nancy" version="2.0.0" targetFramework="net472" />
<package id="Nancy.Hosting.Self" version="2.0.0" targetFramework="net472" />
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="net472" />
</packages>
Ставлю эту же галочку в тестовом проекте. Получаю ту же ошибку. Ок, теперь ошибка вопроизводима!
Причем, если выкинуть из проекта любую из зависимостей - Nancy или Newton - то ошибки, опять таки, нет - ну, правда, и создания типа NancyHost тоже нет.
Еще раз.
Снимаю галочку строкой подписи - нет ошибки. Ставлю галочку - есть ошибка.
Гуглю. Нахожу вот такую рекомендацию , которая сводится к тому, чтобы немного модифицировать вручную файл app.config. Но в моём случае этот совет не помогает.
- Тогда я вспоминаю правило, что "строго подписанные сборки могут загружать только другие строго подписанные сборки".
Но пока не знаю, как это понимать.
Начинаю проверять:
Сначала проверяю на authenticode - подпись:
>signtool verify /pa Newtonsoft.Json.dll
File: Newtonsoft.Json.dll
Index Algorithm Timestamp
========================================
0 sha256 RFC3161
>signtool verify /pa Nancy.dll
File: Nancy.dll
Index Algorithm Timestamp
========================================
SignTool Error: No signature found.
>signtool verify /a TestForms.exe
File: TestForms.exe
Index Algorithm Timestamp
========================================
SignTool Error: No signature found.
получается, что
- файл Newtonsoft.Json.dll имеет подпись authenticode
- файл Nancy.dll не имеет подписи
- но и мой собственный файл TestForms.exe не имеет подписи authenticode
Теперь проверяю при помощи инструмента, который проверяет просто strong name моих assembly:
>sn -v TestForms.exe
Microsoft (R) .NET Framework Strong Name Utility Version 4.0.30319.0
Copyright (c) Microsoft Corporation. All rights reserved.
Assembly 'TestForms.exe' is valid
>sn -v Nancy.dll
Microsoft (R) .NET Framework Strong Name Utility Version 4.0.30319.0
Copyright (c) Microsoft Corporation. All rights reserved.
Nancy.dll does not represent a strongly named assembly
>sn -v Newtonsoft.Json.dll
Microsoft (R) .NET Framework Strong Name Utility Version 4.0.30319.0
Copyright (c) Microsoft Corporation. All rights reserved.
Assembly 'Newtonsoft.Json.dll' is valid
То есть, я вижу, что Nancy не имеет строгого имени.
Можно ли решить эту проблему?
Возможно, нужно пересобрать Nancy со строгим именем?
Как видите, проблема довольно запутанная. Буду рад любым рекомендациям.