Как исправить ошибку «Ссылочная сборка не имеет строгого имени»? - PullRequest
221 голосов
/ 01 декабря 2008

Я добавил сборку со слабым именем в свой проект Visual Studio 2005 (со строгим именем). Теперь я получаю сообщение об ошибке:

«Ссылочная сборка« xxxxxxxx »не имеет строгого имени»

Нужно ли подписывать эту стороннюю сборку?

Ответы [ 13 ]

198 голосов
/ 01 декабря 2008

Чтобы избежать этой ошибки, вы можете либо:

  • Загрузить сборку динамически или
  • Подписать стороннюю сборку.

Инструкции по подписанию сторонних сборок вы найдете в .NET-fu: Подписание неподписанной сборки (без подписи с задержкой) .

Подписание сторонних сборок

Основной принцип подписания третьей стороны -

  1. Разберите сборку с помощью ildasm.exe и сохраните промежуточный язык (IL):

    ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll 
    
  2. Перестройте и подпишите сборку:

    ilasm /dll /key=myKey.snk thirdPartyLib.il
    

Исправление дополнительных ссылок

Описанные выше шаги работают нормально, если ваша сторонняя сборка ( A.dll ) не ссылается на другую библиотеку ( B.dll ), которая также должна быть подписана. Вы можете разобрать, перестроить и подписать A.dll и B.dll , используя приведенные выше команды, но во время выполнения загрузка B.dll завершится неудачно, поскольку A.dll изначально был создан со ссылкой на без знака версию B.dll .

Исправление этой проблемы заключается в исправлении файла IL, созданного на шаге 1 выше. Вам нужно будет добавить токен открытого ключа B.dll к ссылке. Вы получите этот токен, позвонив

sn -Tp B.dll 

, который даст вам следующий вывод:

Microsoft (R) .NET Framework Strong Name Utility  Version 4.0.30319.33440
Copyright (c) Microsoft Corporation.  All rights reserved.

Public key (hash algorithm: sha1):
002400000480000094000000060200000024000052534131000400000100010093d86f6656eed3
b62780466e6ba30fd15d69a3918e4bbd75d3e9ca8baa5641955c86251ce1e5a83857c7f49288eb
4a0093b20aa9c7faae5184770108d9515905ddd82222514921fa81fff2ea565ae0e98cf66d3758
cb8b22c8efd729821518a76427b7ca1c979caa2d78404da3d44592badc194d05bfdd29b9b8120c
78effe92

Public key token is a8a7ed7203d87bc9

Последняя строка содержит токен открытого ключа. Затем вам нужно найти в IL A.dll ссылку на B.dll и добавить токен следующим образом:

.assembly extern /*23000003*/ MyAssemblyName
{
  .publickeytoken = (A8 A7 ED 72 03 D8 7B C9 )                         
  .ver 10:0:0:0
}
93 голосов
/ 10 июля 2012

Разверните файл проекта, который является , используя проект, который "не имеет ключа строгого имени", и найдите файл .snk (.StrongNameKey).

Просмотрите этот файл в Windows Explorer (просто, чтобы вы знали, где он находится).

Вернитесь в Visual Studio в проект, который не имеет "ключа строгого имени", выполните

  • Щелкните правой кнопкой мыши файл проекта
  • Выбрать свойства
  • Выберите «Вкладка подписи» (слева)
  • Установите флажок «Подписать сборку»
  • Затем <Browse> в файл .snk, который вы нашли ранее

Это должно сработать. Это решило проблему для меня в одном проекте, используя форму внутри другого проекта в том же решении.

Надеюсь, это поможет.

55 голосов
/ 08 января 2014

Я искал решение той же проблемы, и снятие галочки с опции «Подписать сборку» работает для меня:

enter image description here

(как вы могли заметить, скриншот взят с VS2010, но, надеюсь, он кому-нибудь поможет)

45 голосов
/ 19 октября 2013

Я написал инструмент для автоматической сборки знаков со строгими именами, в том числе тех, для которых у вас нет исходного кода, или проектов, которые были заброшены. Он использует многие из методов, описанных в ответах, простым способом, без каких-либо недостатков или недостатков существующих инструментов или устаревших инструкций.

http://brutaldev.com/post/2013/10/18/NET-Assembly-Strong-Name-Signer

Надеюсь, что это поможет всем, кому нужно подписать стороннюю сборку, без необходимости прыгать через обручи, чтобы попасть туда.

40 голосов
/ 02 июня 2012

Вы можете использовать неподписанные сборки, если ваша сборка также не подписана.

22 голосов
/ 10 июня 2014

Подписание сторонней сборки у меня сработало:

http://www.codeproject.com/Tips/341645/Referenced-assembly-does-not-have-a-strong-name

EDIT : Я узнал, что полезно размещать шаги, если связанная статья больше не действительна. Все кредиты идут на Hiren Khirsaria :

  1. Запустите командную строку visual studio и перейдите в каталог, где находится ваша DLL.

    For Example my DLL is located inD:/hiren/Test.dll

  2. Теперь создайте файл IL, используя приведенную ниже команду.

    D:/hiren> ildasm /all /out=Test.il Test.dll (эта команда генерирует библиотеку кодов)

  3. Создайте новый ключ для подписи вашего проекта.

    D:/hiren> sn -k mykey.snk

  4. Теперь подпишите вашу библиотеку с помощью команды ilasm.

    D:/hiren> ilasm /dll /key=mykey.snk Test.il

13 голосов
/ 10 мая 2015

Как подписать стороннюю сборку без знака

  1. Откройте командную строку разработчика для Visual Studio. Этот инструмент доступен в ваших программах Windows и может быть найден с помощью поиска Windows по умолчанию.
  2. Убедитесь, что ваша подсказка имеет доступ к следующим инструментам, выполнив их один раз: sn ildasm и ilasm
  3. Перейдите в папку, где находится файл Cool.Library.dll
  4. sn –k Cool.Library.snk для создания новой пары ключей
  5. ildasm Cool.Library.dll /out:Cool.Library.il чтобы разобрать библиотеку
  6. move Cool.Library.dll Cool.Library.unsigned.dll для сохранения исходной библиотеки в качестве резервной копии
  7. ilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk для повторной сборки библиотеки со строгим именем
  8. powershell -command "& {[System.Reflection.AssemblyName]::GetAssemblyName($args).FullName} Cool.Library.dll", чтобы получить полное имя сборки. Этот бит понадобится вам, если вы будете ссылаться на DLL во внешних файлах конфигурации, таких как web.config или app.config.
5 голосов
/ 03 марта 2017

Я столкнулся с этим с помощью DLL ServiceStack, которую я установил с помощью nuget. Оказывается, был еще один набор доступных библиотек, которые были помечены как подписанные. Не будет решением для всех, но вам, возможно, просто нужно проверить существующую подписанную версию вашей сборки. ServiceStack.Signed

5 голосов
/ 17 октября 2013

У меня возникла эта проблема для приложения со строгим именем, затем пришлось изменить его, чтобы ссылаться на сборку с неназванным именем, поэтому я снял флажок «Подписать сборку» в разделе свойств подписи проекта, но оно все еще пожаловался. Я полагал, что это должен был быть артефакт где-то, вызывающий проблему, поскольку я все делал правильно, и это было просто так. Я нашел и удалил строку: [assembly: AssemblyKeyFile ("yourkeyfilename.snk")] из его файла assemblyInfo.cs. Тогда никаких жалоб на сборку после этого.

2 голосов
/ 08 октября 2017

Старый вопрос, но я удивлен, что никто еще не упомянул ilmerge. ilmerge от Microsoft, но не поставляется с VS или SDK. Вы можете скачать его с здесь . Существует также хранилище github . Вы также можете установить из Nuget:

PM>Install-Package ilmerge

Для использования:

ilmerge assembly.dll /keyfile:key.snk /out:assembly.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /ndebug

При необходимости вы можете создать свой собственный ключевой файл, используя sn (из VS):

sn -k key.snk
...