Как исправить ошибку "ссылочная сборка не имеет строгого имени"?
Я добавил слабо названную сборку к моему Visual Studio 2005 проект (который строго назван). Теперь я получаю сообщение об ошибке:
"ссылочная сборка' xxxxxxxx 'не имеет строгого имени"
нужно ли мне подписывать эту стороннюю сборку?
12 ответов:
чтобы избежать этой ошибки можно:
- загрузите сборку динамически, или
- подписать стороннюю сборку.
вы найдете инструкции по подписанию сторонних сборок в разделе .NET-fu: подписание неподписанной сборки (без задержки подписания).
Подписание Сторонних Сборок
основной принцип для того чтобы подписать thirp-party к
разберите сборку с помощью
ildasm.exeи сохранить промежуточный язык (IL):ildasm /all /out=thirdPartyLib.il thirdPartyLib.dllперестроить и подписать сборку:
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
- Правой Кнопкой Мыши на файле проекта
- Выберите Свойства
- выберите "Вкладка подписи" (слева)
- установите флажок "подписать сборку"
- затем <Browse> к .СНК файл, который вы нашли ранее
Это должно сделать трюк. Это решило проблему для меня для одного проекта, используя форму внутри другого проекта в том же решении.
Я надеюсь, что это помогает.
Я искал решение той же проблемы, и опция "подписать сборку" работает для меня:
(как вы можете заметить скриншот приходит от 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:
Запустите командную строку visual studio и перейдите в каталог, где находится ваша DLL расположенный.
For Example my DLL is located inD:/hiren/Test.dllТеперь создайте файл IL с помощью команды ниже.
D:/hiren> ildasm /all /out=Test.il Test.dll(эта команда создает библиотеку кода)создать новый ключ для подписания вашего проекта.
D:/hiren> sn -k mykey.snkтеперь подпишите свою библиотеку с помощью .
D:/hiren> ilasm /dll /key=mykey.snk Test.il
как подписать неподписанную стороннюю сборку
- Откройте командную строку разработчика для Visual Studio. Этот инструмент доступен в ваших оконных программах и может быть найден с помощью поиска Windows по умолчанию.
- убедитесь, что ваше приглашение имеет доступ к следующим инструментам, выполнив их один раз:
snildasmиilasm- перейдите в папку, где ваш прохладно.Библиотека.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.конфиг.
У меня была эта проблема для приложения, которое было строго названо, а затем пришлось изменить его, чтобы ссылаться на сборку без строгого имени, поэтому я снял флажок "подписать сборку" в разделе подписи свойств проекта, но это еще жаловались. Я решил, что артефакт где-то вызывает проблему, так как я сделал все остальное правильно и просто. Я нашел и удалил строку: [assembly: AssemblyKeyFile("yourkeyfilename.snk")] из его сборки.cs-файл. Затем никаких жалоб на сборку после этого.
удаление "подписать сборку" галочка под "подпись" вкладка работает, как сказал @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. 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