-
3장. 공유 어셈블리와 강력한 이름의 어셈블리CLR Via C# 2022. 1. 11. 18:47
CLR이 지원하는 에셈블리의 종류는 두 가지 있다.
- 약한 이름의 어셈블리(공식적인 명칭 아님) : 개별적 배포.
- 강한 이름의 어셈블리 : 공개키 값을 가지는 어셈블리. 공개/비밀 키 쌍을 이용해 서명함. 개별적 배포 또는 전역 배포.
- 서명값의 해시 값 비교를 통해 위조 방지를 할 수 있다.
배포 방법도 두 가지 있다. 개별적 또는 전역으로 배포한다.
- 개별적 : 응용프로그램의 기본 디렉토리 혹은 그 하위 디렉토리에 배포 .
- 전역 : 잘 알려진 위치에 배포 (전역 어셈블리 캐시(GAC) 등)
SN.EXE를 통해 공개/비밀 키 쌍을 만들어 강한 이름의 어셈블리 만들기 가능하다.
Visual Studio에서는
프로젝트 설정에서서명 탭에서어셈블리 서명 체크 박스를 선택한 다음, 콤보 박스의 항목들 중새로 만들기 항목을 선택한다.전역 어셈블리 캐시 (Global Assembly Cache, GAC)
GAC는 공용으로 사용하는 강한 이름의 어셈블리들을 담는 장소이다. (약한 이름의 어셈블리는 못 넣는다!)
GAC는 특정한 구조를 가져서, 임의로 파일을 집어넣는 행위는 삼가야한다. 그래서 사용하는 것이 Gacutil.exe유틸리티이다.
서명 연기
강한 이름의 어셈블리를 만들려면 비밀키로 서명을 해야하지만, 서명연기를 하면 공개키만을 가지고 어셈블리를 만들 수 있다. 하지만 이는 보안에 문제가 있으니 배포 전에는 서명을 하고 배포해야 한다.
서명 연기를 하기 위해선,
/delaysign컴파일러 스위치를 지정하거나, VS에서는서명 탭에서서명만 연기 체크 박스를 체크한다. 서명 연기한 어셈블리를 GAC에 설치하기 위해서는SN.EXE에 -Vr 스위치를 사용해야 한다. ([비밀키]해시 값 점검을 건너뛰게 해줌) 나중에는 -Vu 또는 -Vx 스위치로 무결성 검사 설정을 해제해야 한다.실행중 타입에 대한 참조 흐름
IL 코드에서 참조하는 메서드나 타입을 찾을 때
case 1 - 같은 어셈블리에 존재:
- 같은 PE파일안에 해당 타입이 있으면 바로 내부 자료 구조에 저장
- 다른 PE파일에 해당 타입이 있으면 그 파일 로드해서 저장
cass 2 - 다른 어셈블리에 존재:
- 기본 디렉토리를 검색해 매니페스트를 포함하는 PE파일 로드함(강한 이름의 어셈블리일 때는 GAC도 찾아봄)
- 해당 PE파일에 해당 타입이 있으면 저장, 다른 PE파일에 해당 타입이 있으면 그 파일 로드해서 저장
XML 설정 파일로 관리 기능
XML 설정 파일(확장자는 .config)을 이용하면 특정 버전의 어셈블리를 로드하게 할 수 있다.
게시자 정책 제어
이런 XML 설정 파일을 포함해 게시자 정책 어셈블리를 만들 수 있다. 게시자 정책 어셈블리은 반드시 GAC에 설치되어야 한다. 게시자 정책 어셈블리 보통 어셈블리에 대한 업데이트나 서비스 팩을 제공하는 취지로만 사용된다. 즉 이전 버전이 제공하던 기능이 모두 유지되야한다.
다음은 AL.exe 명령 스위치를 사용해 게시자 정책 어셈블리를 만든 예시이다.
AL.exe /out:Policy.1.0.SomeClassLibrary.dll /version:1.0.0.0 /keyfile:MyCompany.snk /linksource:SomeClassLibrary.config만약, 응용프로그램의 설정 파일 안에
<publisherPolicy apply="no"/>요소를 추가하면 게시자 정책을 무시할 수 있다.'CLR Via C#' 카테고리의 다른 글
6장. 타입과 멤버의 기본 (0) 2022.01.21 5장. 기본, 참조, 값 타입 (0) 2022.01.17 4장. 타입의 기초 (0) 2022.01.14 2장.빌드, 패키징, 배포, 응용프로그램과 타입의 관리 (0) 2022.01.11 1장.CLR의 실행 모델 (0) 2022.01.11