Подписание неподписанного собрания
Недавнее обновление NHibernate 2.1 вывело ситуацию с головной болью на поверхность.
Похоже, что большинство проектов создаются по умолчанию как подписанные сборки. Например, fluentnhibernate ссылается на ключевой файл fluent.snk.
Nhibernate.search собирает неподписанные из того, что я могу собрать, и не будет создавать подписанные, то есть если вы ссылаетесь на сгенерированный ключевой файл, вы получите ошибку:
Ссылочная сборка "Lucene.Net" не имеет строгого имени
Это означает, что такие проекты, как castle.activerecord, в которых в качестве зависимости используется nhibernate.search, не будут создаваться, так как вы получаете ужасающую сборку, на которую ссылается nhibernate.search, не имеет строгого имени:
Довольно много проектов используют caslte.activerecord, поэтому очень важно, чтобы эта сборка.
Кто-нибудь знает, что делать здесь, потому что я полностью вне идей?
Это полное безумие.
4 ответа
- Получите MSIL для предоставленной сборки. В командной строке VS.NET введите следующее: c:>ildasm provideAssembly.dll /out:providedAssembly.il
- Переименуйте / переместите оригинальную сборку, которую я просто добавляю в.orig к имени файла.
- Создайте новую сборку из выходных данных MSIL и файла ключей вашей сборки. Предполагая, что у вас уже есть файл пары ключей сборки, выполните в командной строке VS.NET следующее: c:>ilasm provideAssembly.il /dll /key=keypair001.snk
Источник http://www.andrewconnell.com/blog/archive/2004/12/15/772.aspx
Дело в том, что вы не можете ссылаться на сборки со строгими именами из сборок со строгими именами, но вы можете сделать обратное. Вот почему каждый достойный проект там должен быть подписан.
Когда я сталкиваюсь с этой проблемой, я оставляю строку у автора проекта (или регистрирую проблему) с объяснением в моем комментарии выше, и, пока я жду исправления, я компилирую и подписываю его самостоятельно.
Все приведенные ответы имеют серьезный недостаток - они не работают, если существует более одного неподписанного собрания, которое зависит друг от друга. Вам нужно будет отредактировать IL-файлы вручную, чтобы заменить неподписанные ссылки на подписанные. Это конечно возможно, но подвержено ошибкам.
Есть намного лучший способ. Во-первых, вот мои источники:
- https://www.nuget.org/packages/Nivot.StrongNaming/1.0.4.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
на этот раз с ключом