- 어셈블리(Assembly)는 .NET의 기본 배치(deployment) 단위이다. 모든 형식은 어셈블리 안에 담긴다. 하나의 어셈블리는 컴파일된 형식과 해당 IL(Intermediate Language) 코드, 실행시점 자원, 그리고 보조 정보(버전 관리, 보안, 다른 어셈블리 참조 등을 위한)로 구성된다.
- 어셈블리는 또한 형식 결정과 보안 권한 부여의 경계선을 정의하는 역할도 한다.
- 보통의 경우 하나의 어셈블리는 하나의 Windows PE(Portable Executable) 파일인데, 응용 프로그램 실행 파일(executable)에 해당하는 어셈블리 파일의 확장자는 .exe이고 재사용 가능한 라이브러리의 확장자는 .dll이다.
- 단 WinRT 라이브러리는 확장자가 .winmd이다. WinRT 라이브러리 파일은 .dll과 비슷하나, 메타자료만 있고 IL 코드가 없다는 점이 다르다.
- 이번 장에 등장하는 형식들은 대부분 다음 이름공간들에 정의되어 있다.
- System.Reflection
- System.Resources
- System.Globalization
어셈블리의 구성
- 어셈블리를 구성하는 요소는 다음 네 가지이다.
- 어셈블리 매니페스트
- 어셈블리 매니페스트(Manifest)는 .NET 런타임에 관한 정보를 제공한다. 예컨대 어셈블리의 이름, 버전, 어셈블리가 요청한 권한들, 그리고 어셈블리가 참조하는 다른 어셈블리들의 목록이 어셈블리 매니페스트에 들어 있다.
- 응용 프로그램 매니페스트
- 응용 프로그램 매니페스트는 운영체제에 필요한 정보를 제공한다. 예컨대 어셈블리를 배치하는 방법이나 관리자로의 권한 상승이 필요한지의 여부 등이 응용 프로그램 매니페스트에 들어 있다.
- 컴파일된 형식
- 어셈블리가 정의하는 형식들을 컴파일해서 나온 IL 코드와 형식들의 메타자료(metadata)
- 자원
- 이들 중 필수인 것은 어셈블리 매니페스트 뿐이다. 그러나 WinRT 참조 어셈블리가 아닌 한 어셈블리에는 거의 항상 컴파일된 형식들이 들어 있다.
- 실행 파일 어셈블리와 라이브러리 어셈블리의 구조는 거의 같다. 주된 차이는 실행 파일 어셈블리에는 진입점(entry point)이 정의되어 있다는 점이다.
어셈블리 매니페스트
- 어셈블리 매니페스트의 목적은 다음 두 가지이다.
- 관리되는 호스팅 환경에 어셈블리에 관한 정보를 제공한다.
- 어셈블리에 들어 있는 모듈, 형식, 자원들의 ‘주소록’ 역할을 한다.
- 이런 목적을 위해, 어셈블리는 자기 서술적(self-describing)으로 만들어진다. 즉, 어셈블리의 소비자는 다른 파일들을 참고할 필요 없이 어셈블리 파일만 보고도 어셈블리의 모든 자료와 형식, 기능을 알 수 있다.
- 프로그래머가 어셈블리 매니페스트를 어셈블리에 직접 추가하지는 않는다. 어셈블리 매니페스트는 컴파일 과정에서 자동으로 어셈블리에 내장된다.
- 어셈블리 매니페스트에 담긴 자료 중 기능상 중요한 자료를 요약하자면 다음과 같다.
- 어셈블리의 간단한 이름(이하 ‘단순명’)
- 버전(AssemblyVersion)
- 어셈블리의 공개키와 서명된 해시(강력한 이름이 있는 경우)
- 어셈블리가 참조하는 다른 어셈블리의 목록(해당 버전 및 공개 키 포함)
- 어셈블리를 구성하는 모듈들의 목록
- 어셈블리에 정의되어 있는 형식들의 목록과 각 형식을 담은 모듈 정보
- (선택적) 어셈블리가 요청 또는 거부한 보안 권한들의 집합(SecurityPermission)
- (위성 어셈블리의 경우) 대상 문화권(AssemblyCulture)
- 어셈블리 매니페스트에 다음과 같은 정보성 자료가 들어 있을 수도 있다.
- 전체 제목과 설명(AssemblyTitle과 AssemblyDescription)
- 회사명과 저작권 정보(AssemblyCompany와 AssemblyCopyright)
- 화면 표시용 버전 정보(AssemblyInformationVersion)
- 커스텀 자료를 위한 추가 특성