Подписание неподписанного собрания

Недавнее обновление NHibernate 2.1 вывело ситуацию с головной болью на поверхность.

Похоже, что большинство проектов создаются по умолчанию как подписанные сборки. Например, fluentnhibernate ссылается на ключевой файл fluent.snk.

Nhibernate.search собирает неподписанные из того, что я могу собрать, и не будет создавать подписанные, то есть если вы ссылаетесь на сгенерированный ключевой файл, вы получите ошибку:

Ссылочная сборка "Lucene.Net" не имеет строгого имени

Это означает, что такие проекты, как castle.activerecord, в которых в качестве зависимости используется nhibernate.search, не будут создаваться, так как вы получаете ужасающую сборку, на которую ссылается nhibernate.search, не имеет строгого имени:

Довольно много проектов используют caslte.activerecord, поэтому очень важно, чтобы эта сборка.

Кто-нибудь знает, что делать здесь, потому что я полностью вне идей?

Это полное безумие.

4 ответа

Решение
  1. Получите MSIL для предоставленной сборки. В командной строке VS.NET введите следующее: c:>ildasm provideAssembly.dll /out:providedAssembly.il
  2. Переименуйте / переместите оригинальную сборку, которую я просто добавляю в.orig к имени файла.
  3. Создайте новую сборку из выходных данных MSIL и файла ключей вашей сборки. Предполагая, что у вас уже есть файл пары ключей сборки, выполните в командной строке VS.NET следующее: c:>ilasm provideAssembly.il /dll /key=keypair001.snk

Источник http://www.andrewconnell.com/blog/archive/2004/12/15/772.aspx

Дело в том, что вы не можете ссылаться на сборки со строгими именами из сборок со строгими именами, но вы можете сделать обратное. Вот почему каждый достойный проект там должен быть подписан.

Когда я сталкиваюсь с этой проблемой, я оставляю строку у автора проекта (или регистрирую проблему) с объяснением в моем комментарии выше, и, пока я жду исправления, я компилирую и подписываю его самостоятельно.

Все приведенные ответы имеют серьезный недостаток - они не работают, если существует более одного неподписанного собрания, которое зависит друг от друга. Вам нужно будет отредактировать IL-файлы вручную, чтобы заменить неподписанные ссылки на подписанные. Это конечно возможно, но подвержено ошибкам.

Есть намного лучший способ. Во-первых, вот мои источники:

  1. https://www.nuget.org/packages/Nivot.StrongNaming/1.0.4.2
  2. Как скачать пакет Nuget без nuget.exe или расширения Visual Studio?

Первая - это ссылка на пакет NuGet под названием StrongNaming, который позволяет строго называть сборки, а также заботится о неподписанных ссылках для вас! Второй описывает, как при необходимости загружать пакеты NuGet без Visual Studio.

Я лично использовал Visual Studio для его загрузки с помощью самого менеджера пакетов NuGet, однако вы всегда можете перейти непосредственно по https://www.nuget.org/api/v2/package/Nivot.StrongNaming/1.0.4.2 и скачать файл nivot.strongnaming.1.0.4.2.zip

E сть tools папка в загруженном zip-архиве (или в пакете, если использовался NuGet). Найдя его, вы можете легко установить его как модуль PowerShell.

Подробное руководство размещено по адресу http://buffered.io/posts/net-fu-signing-an-unsigned-assembly-without-delay-signing.

Таким образом, процедура выглядит следующим образом:

  • Разберите целевой двоичный файл, используя ildasm
  • Восстановить / собрать с помощью ilasmна этот раз с ключом
Другие вопросы по тегам