C#: несовместимость NancyFx и Newtonsoft.Json в одном strongly signed проекте

Господа.

Я встретился со странной ситуацией.

Работаю в WinForms - проекте на NET Framework 4.7.2.

  1. Использую фреймворк 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
  1. И всё идёт прекрасно.

До того момента, когда я пытаюсь выкатить своё решение в 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. Но в моём случае этот совет не помогает.

  1. Тогда я вспоминаю правило, что "строго подписанные сборки могут загружать только другие строго подписанные сборки".

Но пока не знаю, как это понимать.

Начинаю проверять:

Сначала проверяю на 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 со строгим именем?

Как видите, проблема довольно запутанная. Буду рад любым рекомендациям.


Ответы (0 шт):