ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 - 같은 어셈블리에 존재:

    1. 같은 PE파일안에 해당 타입이 있으면 바로 내부 자료 구조에 저장
    2. 다른 PE파일에 해당 타입이 있으면 그 파일 로드해서 저장

    cass 2 - 다른 어셈블리에 존재:

    1. 기본 디렉토리를 검색해 매니페스트를 포함하는 PE파일 로드함(강한 이름의 어셈블리일 때는 GAC도 찾아봄)
    2. 해당 PE파일에 해당 타입이 있으면 저장, 다른 PE파일에 해당 타입이 있으면 그 파일 로드해서 저장
    3.  

    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"/> 요소를 추가하면 게시자 정책을 무시할 수 있다.

Designed by Tistory.