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



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




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




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

812   12  

12 ответов:

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

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

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

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

основной принцип для того чтобы подписать thirp-party к

  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

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

sn -k key.snk

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

Comments

    Ничего не найдено.