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

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

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

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

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

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

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

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

Основным принципом подписи участника тирпа является

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

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

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

Фиксация дополнительных ссылок

Вышеуказанные шаги работают нормально, если ваша сторонняя assembly ( 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 of A.dll для ссылки на B.dll и добавить токен следующим образом:

 .assembly extern /*23000003*/ MyAssemblyName { .publickeytoken = (A8 A7 ED 72 03 D8 7B C9 ) .ver 10:0:0:0 } 

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

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

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

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

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

Я надеюсь, что это помогает.

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

введите описание изображения здесь

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

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

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

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

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

Для меня работала подпись третьей стороны:

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

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

  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 команды ilasm .

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

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

  1. Откройте командную строку Developer Command Prompt для Visual Studio. Этот инструмент доступен в ваших программах Window и может быть найден с использованием поиска по умолчанию 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.

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

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

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

Добавьте здесь самый простой способ подписать ваши собственные файлы и / или файлы других людей. Вам просто нужно добавить эту строку в «Командная строка события после сборки»:

 "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)" 

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

введите описание изображения здесь

Старый вопрос, но я удивлен, что никто еще не упомянул Ильмерга. ilmerge от Microsoft, но не поставляется с VS или SDK. Вы можете скачать его здесь . Существует также repository 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 

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

Давайте будем гением компьютера.