[C#] “참조 된 어셈블리에 강력한 이름이 없습니다”오류를 수정하는 방법?

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

“참조 된 어셈블리 ‘xxxxxxxx’에 강력한 이름이 없습니다.”

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



답변

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

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

.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
}


답변

“강력한 이름 키가없는”프로젝트를 사용 하는 프로젝트 파일을 확장하고 .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 에게 전달됩니다 .

  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


답변

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

  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을 참조해야하는 경우이 비트가 필요합니다.