Visual Studio 2005 프로젝트 ( 약칭)에 약한 이름의 어셈블리를 추가했습니다 . 이제 오류가 발생합니다.
"참조 된 어셈블리 'xxxxxxxx'에 강력한 이름이 없습니다."
이 타사 어셈블리에 서명해야합니까?
Visual Studio 2005 프로젝트 ( 약칭)에 약한 이름의 어셈블리를 추가했습니다 . 이제 오류가 발생합니다.
"참조 된 어셈블리 'xxxxxxxx'에 강력한 이름이 없습니다."
이 타사 어셈블리에 서명해야합니까?
답변:
이 오류를 피하려면 다음 중 하나를 수행하십시오.
.NET-fu : 서명되지 않은 어셈블리 서명 (지연 서명없이) 에서 타사 어셈블리 서명에 대한 지침을 찾을 수 있습니다.
파업 파티에 서명하는 기본 원칙은
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 을 모두 분해, 재 구축 및 서명 할 수 있지만 런타임에 A.dll 이 원래 서명되지 않은 B.dll 버전을 참조하여 빌드 되었기 때문에 B.dll 로드 가 실패 합니다.
이 문제에 대한 수정은 위의 1 단계에서 생성 된 IL 파일을 패치하는 것입니다. 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
마지막 줄에는 공개 키 토큰이 있습니다. 그런 다음 B.dll 에 대한 참조를 A.dll 의 IL에서 검색하고 다음과 같이 토큰을 추가해야합니다.
.assembly extern /*23000003*/ MyAssemblyName
{
.publickeytoken = (A8 A7 ED 72 03 D8 7B C9 )
.ver 10:0:0:0
}
"강력한 이름 키가없는"프로젝트를 사용 하는 프로젝트 파일을 확장하고 .snk
파일 (.StrongNameKey)을 찾으십시오.
Windows 탐색기 에서이 파일을 찾아보십시오 (파일의 위치를 알 수 있도록).
"강력한 이름 키가없는"프로젝트의 Visual Studio로 돌아가서
<Browse>
받는 .snk
파일 당신은 이전에 발견그 트릭을해야합니다. 이것은 같은 솔루션에서 다른 프로젝트의 양식을 사용하여 한 프로젝트의 문제를 해결했습니다.
도움이 되길 바랍니다.
나는 똑같은 문제에 대한 해결책을 찾고 있었고 "조회 서명"옵션을 선택 취소하면 나에게 적합합니다.
(스크린 샷은 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
편집 : 연결된 기사가 더 이상 유효하지 않은 경우 단계를 게시하는 것이 도움이된다는 것을 알게되었습니다. 모든 크레딧은 Hiren 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
이제 ilasm
명령을 사용하여 라이브러리에 서명하십시오 .
D:/hiren> ilasm /dll /key=mykey.snk Test.il
sn
ildasm
및ilasm
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"
정규화 된 어셈블리 이름을 가져옵니다. web.config 또는 app.config와 같은 외부 구성 파일에서 DLL을 참조해야하는 경우이 비트가 필요합니다.강력하게 명명 된 응용 프로그램에 대해이 문제가 있었고 강하게 명명되지 않은 어셈블리를 참조하기 위해 변경해야했기 때문에 프로젝트 속성 서명 섹션에서 '조회 서명'을 선택 해제했지만 여전히 불평했습니다. 다른 모든 것을 올바르게 수행했기 때문에 문제를 일으키는 어딘가에 인공물이 있어야한다고 생각했습니다. assemblyInfo.cs 파일에서 [assembly : AssemblyKeyFile ( "yourkeyfilename.snk")] 줄을 찾아 제거했습니다. 그런 다음 그 후에 빌드 불만이 없습니다.
"서명" 탭 에서 " 조립품에 서명" 체크 표시를 제거하면 @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의의 저장소. 너겟에서도 설치할 수 있습니다 :
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
1> Register-PackageSource -ProviderName NuGet -Name NuGet -Location http://www.nuget.org/api/v2
2> Install-Package -Name ILMerge
3> $env:path += ';C:\Program Files\PackageManagement\NuGet\Packages\ilmerge.2.14.1208\tools'
4> ILMerge.exe .\packages\WireMock.Net.1.0.4.2\lib\net452\WireMock.Net.dll /keyfile:key.snk /out:WireMock.Net.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /ndebug /lib:.\packages\Newtonsoft.Json.10.0.3\lib\net45\ /lib:.\packages\Handlebars.Net.1.9.0\lib\net40 /lib:.\packages\SimMetrics.Net.1.0.4\lib\net45 /lib:.\packages\Microsoft.Owin.2.0.2\lib\net45 /lib:.\packages\Owin.1.0\lib\net40 /lib:.\packages\Microsoft.Owin.Hosting.2.0.2\lib\net45 /lib:.\packages\MimeKitLite.2.0.1\lib\net45 /lib:.\packages\XPath2.1.0.5.1\lib\net40 /lib:.\packages\RestEase.1.4.4\lib\net45
먼저 모든 너겟 패키지가 솔루션의 모든 프로젝트에서 동일한 버전인지 확인하십시오. 예를 들어 하나의 프로젝트가 NLog 4.0.0.0을 참조하고 다른 프로젝트가 NLog 4.1.0.0을 참조하는 것을 원하지 않습니다. 그런 다음 nuget 패키지를 다시 설치하십시오.
업데이트 패키지-다시 설치
어셈블리 A에서 참조한 타사 어셈블리가 3 개 있었으며 어셈블리 B에서 A를 참조한 어셈블리에 2 개만 포함되었습니다.
update package 명령으로 써드 파티 어셈블리에 대한 누락 된 참조가 추가되었으며 오류가 사라졌습니다.