"참조 된 어셈블리에 강력한 이름이 없습니다"오류를 수정하는 방법?


242

Visual Studio 2005 프로젝트 ( 약칭)에 약한 이름의 어셈블리를 추가했습니다 . 이제 오류가 발생합니다.

"참조 된 어셈블리 'xxxxxxxx'에 강력한 이름이 없습니다."

이 타사 어셈블리에 서명해야합니까?



1
이것은 어리석은 팁처럼 들릴 수 있지만 수행 한 작업에 관계없이 어셈블리에 서명하지 않은 경우 빌드 설정을 확인하십시오. VS는 다시 빌드 / 정리 할 때 다른 아키텍처 (모든 CPU, x64 등)를 지우지 않으므로 다른 아키텍처에서 오래된 dll을 볼 수 있습니다.
jrh

답변:


213

이 오류를 피하려면 다음 중 하나를 수행하십시오.

  • 어셈블리를 동적으로로드하거나
  • 타사 어셈블리에 서명하십시오.

.NET-fu : 서명되지 않은 어셈블리 서명 (지연 서명없이) 에서 타사 어셈블리 서명에 대한 지침을 찾을 수 있습니다.

타사 어셈블리에 서명

파업 파티에 서명하는 기본 원칙은

  1. ildasm.exe중간 언어 (IL)를 사용하여 어셈블리를 분해 하고 저장하십시오.

    ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll 
  2. 어셈블리를 다시 작성하고 서명하십시오.

    ilasm /dll /key=myKey.snk thirdPartyLib.il

추가 참조 수정

위의 단계는 타사 어셈블리 ( A.dll ) 가 서명 해야하는 다른 라이브러리 ( B.dll )를 참조 하지 않는 한 제대로 작동합니다 . 위의 명령을 사용하여 A.dllB.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
}

2
따라서 어셈블리에 옵션에 서명하고 있으므로 어셈블리를 동적으로로드하거나 서명하지 않습니다. 강력한 명명은 GAC (Global Assembly Cache)와 관련이 있습니다. 그럼에도 불구하고 어셈블리를 GAC의 일부로 만들고 싶지 않으며 COM으로 보이지도 않습니다. 이 어셈블리를 서명하지 않고 사용할 수 있도록 우리가 할 수있는 일을 부분적으로 기억합니다. 옵션 속성 어딘가에 있습니다. 나는 그런 식으로 가고 싶지 않다?
Will Marcouiller

27
어셈블리도 서명되지 않은 경우 서명되지 않은 어셈블리를 사용할 수 있습니다.
OJ.

2
.NET-fu에 대한 링크는 멋진 자료입니다.
TheDude

2
위의 단계는 "대부분의"상황에서 작동하지만 시간이 많이 걸리고 오류가 발생하기 쉽고 친구 어셈블리 참조로 인해 실패합니다. 이 유틸리티를 사용하여 모든 것을 자동으로 수행하십시오 (shameless plug) : stackoverflow.com/a/19459609/564726
BrutalDev

1
@Roel 여기에 프로세스에 대해 자세히 설명했습니다. delabs.io/the-12th-labor-of-a-net-developer-part-4
TheDude

98

"강력한 이름 키가없는"프로젝트를 사용 하는 프로젝트 파일을 확장하고 .snk파일 (.StrongNameKey)을 찾으십시오.

Windows 탐색기 에서이 파일을 찾아보십시오 (파일의 위치를 알 수 있도록).

"강력한 이름 키가없는"프로젝트의 Visual Studio로 돌아가서

  • 프로젝트 파일을 마우스 오른쪽 버튼으로 클릭하십시오
  • 속성 선택
  • "서명 탭"(왼쪽)을 선택하십시오.
  • "조립품 서명"확인란을 클릭하십시오.
  • 그런 다음 <Browse>받는 .snk파일 당신은 이전에 발견

그 트릭을해야합니다. 이것은 같은 솔루션에서 다른 프로젝트의 양식을 사용하여 한 프로젝트의 문제를 해결했습니다.

도움이 되길 바랍니다.


어셈블리에 서명하고 싶지 않다면 처음부터 서명하지 않았을 것입니다!
mohas

.snk 파일을 찾을 수없는 경우 : "강력한 이름"오류가있는 프로젝트를 사용하는 프로젝트의 프로젝트 속성을 열고 서명을 탭하십시오. 프로젝트 서명에 사용 된 파일이 표시됩니다 (확장자가 .snk 인 파일은 아님). 이 설정을 다른 프로젝트로 복사하면됩니다.
Coder14

MrOli3000이 지적했듯이 강력한 이름 키 파일이없는 솔루션이 하나만있는 경우에만 작동합니다. 서명되지 않은 프로젝트를 참조하는 여러 프로젝트가있는 경우 충돌을 피하기 위해 강력한 이름 키 파일을 새로 만드는 것이 좋습니다. 내 경우에는 솔루션이 빌드되지 않았고 수정하려고하는 서클에 갔다. VS2017 기준으로 형식은 .snk가 아닌 .pfx이지만 단계는 동일합니다. 솔루션을 마우스 오른쪽 버튼으로 클릭하고 속성을 선택하십시오. 왼쪽에 나열된 탭에서 "서명"을 선택하십시오. 확인란을 클릭하고 새로 만들기 ...를 선택하십시오. 이름을 제공하십시오! 그리고 Voila! 완료!)
Raj

59

나는 똑같은 문제에 대한 해결책을 찾고 있었고 "조회 서명"옵션을 선택 취소하면 나에게 적합합니다.

여기에 이미지 설명을 입력하십시오

(스크린 샷은 VS2010에서 제공되지만 누군가에게 도움이되기를 바랍니다)


MVC 프로젝트에서이 설정을 확인하지 않습니다. 그러나 여전히 의존성 중 하나에 대해 불평하고 있습니다. MVC에 대한 다른 설정이 있습니까?
Hamid Mayeli 2016 년

51

소스 코드가없는 프로젝트 나 포기한 프로젝트를 포함하여 자동으로 강력한 이름의 어셈블리를 작성하는 도구를 작성했습니다. 기존 도구 나 날짜가 지정된 지침의 결함이나 단점없이 간단한 방법으로 답변에 설명 된 많은 기술을 사용합니다.

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

희망이 있기 때문에 후프를 뛰어 넘지 않고도 타사 어셈블리에 서명 해야하는 사람이 도움이되기를 바랍니다.



23

타사 어셈블리에 서명하면 나를 위해 일했습니다.

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

편집 : 연결된 기사가 더 이상 유효하지 않은 경우 단계를 게시하는 것이 도움이된다는 것을 알게되었습니다. 모든 크레딧은 Hiren Khirsaria 에게 전달됩니다 .

  1. Visual Studio 명령 프롬프트를 실행하고 DLL이있는 디렉토리로 이동하십시오.

    For Example my DLL is located in D:/hiren/Test.dll

  2. 이제 아래 명령을 사용하여 IL 파일을 작성하십시오.

    D:/hiren> ildasm /all /out=Test.il Test.dll (이 명령은 코드 라이브러리를 생성합니다)

  3. 프로젝트에 서명 할 새 키를 생성하십시오.

    D:/hiren> sn -k mykey.snk

  4. 이제 ilasm명령을 사용하여 라이브러리에 서명하십시오 .

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


당신의 링크가 트릭을 만들었습니다! 감사합니다! 또한 mykey.snk를 만드는 방법을 설명합니다 (다른 답변은 어떻게 말하지
않습니까

15

서명되지 않은 타사 어셈블리에 서명하는 방법

  1. Visual Studio 용 개발자 명령 프롬프트를 엽니 다. 이 도구는 Window 프로그램에서 사용할 수 있으며 기본 Windows 검색을 사용하여 찾을 수 있습니다.
  2. 귀하의 메시지가 한 번을 실행하여 다음과 같은 도구에 액세스 할 수 있는지 확인 : sn ildasmilasm
  3. Cool.Library.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"정규화 된 어셈블리 이름을 가져옵니다. web.config 또는 app.config와 같은 외부 구성 파일에서 DLL을 참조해야하는 경우이 비트가 필요합니다.

6

강력하게 명명 된 응용 프로그램에 대해이 문제가 있었고 강하게 명명되지 않은 어셈블리를 참조하기 위해 변경해야했기 때문에 프로젝트 속성 서명 섹션에서 '조회 서명'을 선택 해제했지만 여전히 불평했습니다. 다른 모든 것을 올바르게 수행했기 때문에 문제를 일으키는 어딘가에 인공물이 있어야한다고 생각했습니다. assemblyInfo.cs 파일에서 [assembly : AssemblyKeyFile ( "yourkeyfilename.snk")] 줄을 찾아 제거했습니다. 그런 다음 그 후에 빌드 불만이 없습니다.


감사합니다! 귀하의 답변으로 인해 내 문제 (ClosedXML)에 대해 다시 확인하고 ClosedXML.Signed nuget 패키지를 찾았습니다.
Kiryl

6

nuget과 함께 설치 한 ServiceStack dll을 사용 하여이 문제를 해결했습니다. 서명 된 레이블이있는 다른 dll 세트가 있음이 밝혀졌습니다. 모든 사람에게 답이되지는 않지만 기존의 서명 된 버전의 어셈블리 만 확인하면됩니다.ServiceStack.Signed


2

나에게 내 문제는 서로 다른 버전으로 동일한 NuGet 패키지 두 개가 설치되어 있다는 것입니다.


2

"서명" 탭 에서 " 조립품에 서명" 체크 표시를 제거하면 @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)"

다른 사람의 파일이나 자신의 파일에 원하는만큼 서명 할 수 있습니다.

여기에 이미지 설명을 입력하십시오


5
이것은 다른 종류의 서명입니다. OP가 요구하는 것은 강력한 이름으로 .NET 어셈블리에 서명하는 방법입니다. 코드 서명 인증서로 실행 파일에 서명하는 방법을 보여줍니다. 다른 것들.
블루 토크

2

오래된 질문이지만 아무도 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
WireMock.Net에 문제가 있었고 마침내 작동했지만 PowerShell 명령을 알아내는 데 약간의 시간이 걸렸습니다. 특히 ILMerge가 어셈블리에 서명하도록하는 / lib 인수 전체.
François

1> Register-PackageSource -ProviderName NuGet -Name NuGet -Location http://www.nuget.org/api/v2
François

2> Install-Package -Name ILMerge
François

3> $env:path += ';C:\Program Files\PackageManagement\NuGet\Packages\ilmerge.2.14.1208\tools'
François

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
François

1

상황 : 솔루션 X, Y에 프로젝트 A, B, C, D가 있습니다.

X의 프로젝트 A, B, C Y의 프로젝트 A, C, D

프로젝트 A에서 프로젝트 C를 사용해야하지만 나중에는 사용하지 않습니다. bin 디버그 프로젝트 A에는 C.dll이있었습니다.

솔루션 X를 컴파일하면 모든 것이 좋으며 (이 솔루션에서는 참조 A-> C. 삭제) 솔루션 Y에서는이 문제가 발생합니다.

솔루션은 프로젝트 A bin 디버그에서 C.dll을 삭제합니다.


0

먼저 모든 너겟 패키지가 솔루션의 모든 프로젝트에서 동일한 버전인지 확인하십시오. 예를 들어 하나의 프로젝트가 NLog 4.0.0.0을 참조하고 다른 프로젝트가 NLog 4.1.0.0을 참조하는 것을 원하지 않습니다. 그런 다음 nuget 패키지를 다시 설치하십시오.

업데이트 패키지-다시 설치

어셈블리 A에서 참조한 타사 어셈블리가 3 개 있었으며 어셈블리 B에서 A를 참조한 어셈블리에 2 개만 포함되었습니다.

update package 명령으로 써드 파티 어셈블리에 대한 누락 된 참조가 추가되었으며 오류가 사라졌습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.