Как исправить ошибку "ссылочная сборка не имеет строгого имени"?
Я добавил слабо названную сборку к моему Visual Studio 2005 project (который сильно назван). Теперь я получаю ошибку:
"ссылочная сборка" xxxxxxxx "не имеет строгого имени"
Мне нужно подписать эту сборку третьей стороны?
12 ответов
чтобы избежать этой ошибки можно:
- загрузите сборку динамически или
- войдите сторонних ассамблеи.
вы найдете инструкции по подписанию сторонних сборок в .NET-fu: подписание неподписанной сборки (без задержки).
Подписание Сторонних Сборок
основной принцип подписать thirp-участник
-
разберите сборку с помощью
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
редактировать: Я узнал, что полезно публиковать шаги, если связанная статья больше не действительна. Весь кредит идет на Хирен Khirsaria:
-
Запустите командную строку visual studio и перейдите в каталог, где находится ваша DLL расположенный.
For Example my DLL is located in
D:/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 по умолчанию.
- убедитесь, что ваше приглашение имеет доступ к следующим инструментам, выполнив их один раз:
sn
ildasm
и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 или 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, установленных с разными версиями.