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

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

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

Мне нужно подписать эту сборку третьей стороны?

12 ответов


чтобы избежать этой ошибки можно:

  • загрузите сборку динамически или
  • войдите сторонних ассамблеи.

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

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

основной принцип подписать thirp-участник

  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
}

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

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

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

  • щелкните правой кнопкой мыши файл проекта
  • Выберите Свойства
  • выберите "Вкладка подписи" (слева)
  • установите флажок "подписать сборку"
  • затем &ltBrowse> к .СНК файл, который вы нашли ранее

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

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


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

enter image description here

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


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

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

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


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


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

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

редактировать: Я узнал, что полезно публиковать шаги, если связанная статья больше не действительна. Весь кредит идет на Хирен 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. теперь подпишите свою библиотеку с помощью .

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


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

  1. Откройте командную строку разработчика для Visual Studio. Этот инструмент доступен в оконных программах и может быть найден с помощью поиска Windows по умолчанию.
  2. убедитесь, что ваше приглашение имеет доступ к следующим инструментам, выполнив их один раз:sn ildasm и ilasm
  3. перейдите в папку, где ваш прохладный.Библиотека.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.конфиг.

У меня была эта проблема для приложения, которое было сильно названо, затем пришлось изменить его, чтобы ссылаться на сборку с неполным именем, поэтому я снял флажок "подписать сборку" в разделе подписи свойств проекта, но это еще жаловались. Я решил, что это должен быть артефакт, вызывающий проблему, так как я все сделал правильно, и это было именно так. Я нашел и удалил строку: [assembly: AssemblyKeyFile("yourkeyfilename.snk")] из его ассемблера.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)"

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

enter image description here


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