강력한 이름의 어셈블리를 사용하는 이유는 무엇입니까?


107

강력한 명명 된 어셈블리를 사용하면 어떤 이점이 있습니까?

일반 조립으로 할 수없는 일은 무엇입니까?

답변:


92

먼저 어셈블리 이름을 강력하게 지정할 때의 이점을 나열하겠습니다.

  1. 어셈블리 이름을 강력하게 지정하면 GAC ( 전역 어셈블리 캐시)에 어셈블리를 포함 할 수 있습니다 . 따라서 여러 응용 프로그램간에 공유 할 수 있습니다.

  2. 강력한 이름 지정은 해당 어셈블리의 고유 한 이름을 보장합니다. 따라서 다른 사람은 동일한 어셈블리 이름을 사용할 수 없습니다.

  3. 강력한 이름은 어셈블리의 버전 계보를 보호합니다. 강력한 이름은 아무도 어셈블리의 후속 버전을 생성 할 수 없도록합니다. 응용 프로그램 사용자는로드중인 어셈블리 버전이 응용 프로그램이 빌드 된 버전을 생성 한 동일한 게시자로부터 온 것인지 확인합니다.

Microsoft의 강력한 이름 지정에 대한 자세한 내용은 Strong-Named Assemblies ( MSDN )에 있습니다.


1
항목 4가 확실합니까? 이 bahavior가 최근에 변경된 것 같습니다. 강력하게 명명 된 어셈블리의로드를 수정하여 실패하도록 시도했지만 문제없이로드되었습니다.
Jens

19
잘못된 # 4에 관해서. 변조로부터 보호하도록 설계되지 않았습니다. 자세한 내용은 blogs.msdn.com/b/shawnfa/archive/2005/12/13/… 을 참조하십시오 .
Colin Bowern 2013 년

1
@ RobV8R 종속성의 90 %는 오픈 소스이며, 개인 키는 공개 git 저장소 (Microsoft 권장 사항에 따라)에 있으며 원하는 모든 사람이 사용할 수 있습니다.
trampster

1
@ RobV8R 여기서 타협 된 단어는 사용할 수 없습니다. 이는 처음에는 비밀이 될 것이라는 것을 의미합니다. Microsoft 지침은 개인 키를 공개 소스 저장소에 보관해야한다는 것입니다. 개인 키는 손상되지 않으며 의도적으로 게시됩니다. 개인 키가 알려져 있고 상위 프로젝트의 오픈 소스 코드를 수정하는 사람들이 사용하도록 의도 된 경우 (그렇지 않으면 많은 경우 라이선스가 위반 될 수 있음) 이렇게하는 사람들은 다른 버전 번호를 사용하지만 동일한 키를 사용합니다. 바인딩 리디렉션이 필요한 경우.
trampster

1
@ RobV8R 내가 원래 얻은 것은 많은 사람들이 강력한 이름 지정이 종속성이 어셈블리의 특정 버전에 잠겨 있음을 보장한다고 믿고 있다는 것입니다. 단순한 바인딩 리디렉션은 사용하는 버전을 변경할 수 있습니다. 동일한 개인 키로 서명되었습니다. 그리고 내가 말했듯이 개인 키는 대부분의 종속성에 대해 의도적으로 게시됩니다.
trampster

9

일반 조립으로 할 수없는 일은 무엇입니까?

Nuget의 부상과 함께 시작된 모든 토론에서 강력한 이름의 어셈블리를 완전히 제거 할 것을 제안했기 때문에 회사에서 시도한 결과 응용 프로그램 설정과 관련하여 동작이 크게 변경되었습니다.

VisualStudio에서 제공하는 자동 앱 또는 사용자 범위 응용 프로그램 설정 (System.Configuration.ApplicationSettingsBase 상속)을 사용하는 경우 강력한 이름의 EXE는 EXE 위치에 관계없이 "YourApplication.exe_StrongName_kjsdfzsuzdfiuzgpoisdiufzsdouif"와 같이 이름이 % LOCALAPPDATA % 내에 정확히 1 개의 디렉터리를 만듭니다. 위치.

그러나 강력한 이름이 없으면 EXE의 위치 (= path)를 사용하여 DEBUG와 RELEASE 빌드간에 이미 다른 해시 값을 생성하여 "YourApplication.exe_Url_dfg8778d6fs7g6d7f8g69sdf"와 같은 이름의 % LOCALAPPDATA % 내에 많은 디렉토리를 생성합니다. 이렇게하면 업데이트 할 때마다 설치 디렉터리가 변경되는 ClickOnce 배포에 사용할 수 없습니다.


5

강력한 이름 없이는 구성 파일에서 바인딩 리디렉션을 사용할 수 없다는 것을 추가하고 싶습니다.

작동하지 않습니다.

  <dependentAssembly>
    <assemblyIdentity name="MyAssembly.MyComponent" publicKeyToken="null" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>

공개 키 토큰이 필요합니다.

  <dependentAssembly>
    <assemblyIdentity name="MyAssembly.MyComponent" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>

9
강력한 이름이 아닌 경우 바인딩 리디렉션이 필요하지 않습니다.
trampster

0

예 : 보안에 더 중점을두고 답변을 드리고 싶습니다 . 제 3 자에게 재사용하고 싶지는 않지만 테스트 가능하도록 소스 코드로 어셈블리를 생성하는 경우 어셈블리에 강력하게 서명하고 내부가 같은 서명.

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