Как исправить ошибку "Связанная сборка не имеет сильного имени"?

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

"Ссылка на сборку" xxxxxxxx "не имеет сильного имени"

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

Ответ 1

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

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

Инструкции по подписанию сторонних сборок вы найдете в .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
}

Ответ 2

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

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

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

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

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

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

Ответ 3

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

enter image description here

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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

РЕДАКТИРОВАТЬ: я узнал, что это полезно, чтобы опубликовать шаги в случае, если связанная статья больше не действительна. Вся заслуга Hiren Khirsaria:

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

    For Example my DLL is located in D: /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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

Снятие отметки "Подписать сборку" на вкладке "Подпись" работает, как сказал @Michal Stefanow.

Добавьте здесь самый простой способ подписать ваши собственные файлы и/или файлы других людей. Вам просто нужно добавить эту строку в командной строке "Post-build event":

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\signtool.exe" sign /f "$(ProjectDir)\YourPfxFileNameHere.pfx" /p YourPfxFilePasswordHere /d "Your software title here" /du http://www.yourWebsiteHere.com /t http://timestamp.verisign.com/scripts/timstamp.dll /v "$(BaseOutputPath)$(TargetFileName)"

Вы можете подписывать файлы других людей или свои собственные файлы и сколько угодно.

enter image description here

Ответ 11

Старый вопрос, но я удивлен, что никто еще не упомянул 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

Ответ 12

Иногда может быть возможно, что cmd не может найти правильный путь для ildsm и ilasm, и вы можете столкнуться с проблемами и можете запутаться. Затем вам нужно будет указать полный путь для всех. Чтобы получить полный путь, используйте cmd.

http://onlyforcoder.blogspot.in/2017/11/how-to-sign-unsigned-third-party.html

Ответ 13

Для меня моя проблема заключалась в том, что у меня было два одинаковых пакета NuGet с разными версиями.

Ответ 14

Ситуация: у вас был проект A, B, C, D в решении X, Y

Проект A, B, C в X Проект A, C, D в Y

Мне нужно использовать проект C в проекте A, но позже я не буду использовать. В бен Debug проекта А был C.dll.

Если я компилирую решение X, все хорошо (в этом решении я удаляю ссылку A → C.), но в решении Y я получаю эту проблему.

Решение - удалить C.dll в проекте A bin Debug.