어셈블리 하면 다들 어셈블리어랑 어셈블러가 생각날지도 모르겠군요…ㅇㅂㅇ;;;
어셈블리는 닷넷의 컴파일된 모듈로 버전 관리되는 배포의 단위입니다. 프로그램 시작 진입점(main 함수)을 가지고 있는 exe 파일과 다른 프로그램으로 시작되는 dll 확장자를 가지고 있습니다. 또 여러 파일로 이루어진 다중 파일 어셈블리와 하나의 파일로 이루어진 단일 파일 어셈블리로 나눌 수 있으며 하나의 응용 프로그램에서 사용하느냐 여러 응용 프로그램에서 사용하느냐에 따라 전용 어셈블리와 공용 어셈블리로 나눌 수 있습니다. 근데 대부분 보는 것은 단일 파일 어셈블리입니다. 이건 좀 더 나중에 다룰 수 있으면 좋겠군요.
위의 그림이 어셈블리 구조입니다.
- 메니페스트: 어셈블리 자체의 정보를 갖는 메타데이터. 이 어셈블리가 또 다른 어떤 어벨블리를 참조하는지부터 사진에 대한 정보를 모두 담고있다.
- 형식 메타데이터: 어셈블리에서 사용하는 모든 형식에 대한 구체적이고 자세한 정보를 가지고 있다. 형식 메타데이터 덕분에 리플렉션 기능이 가능하다.
- CIL 코드: Common Intermediate Language의 약자로, 모든 닷넷 언어들이 만들어 내는 중간코드이다. 이 중간코드는 실행 시 Just-In-Time(JIT)에 의해 네이티브 코드로 변환된다.
닷넨 어셈블리는 CIL 코드라는 중간 코드를 가지고 있다고 했습니다. 그럼 이 구조도 한번 봐야죠. ㅇㅅㅇ
위의 구조가 각각의 닷넷 언어의 컴파일러와 Jitter 컴파일러 구조를 보여주는 구조도입니다. 각 닷넨 언어의 컴파일러는 동일한 어셈블리를 만들어 냅니다. 또 이 어셈블리를 어셈블러가 사용되는 시점(실행 시간)에 단 한번(캐싱) 네이티브 코드로 변환합니다. (이 말은 즉, 동일한 논리적, 구조적으로 프로그램을 작성한다면 작성 언어에 대해 굳이 따지지 않는다는 것도 있습니다. ㅇㅅㅇ)
이 외에도 외부에서 라이브러리를 참조하는 과정이 클래스 로더에 있습니다. 주로 사용되는 클래스 라이브러리는 Base Class Library라는 이름으로 닷넷이 있고, 추가적인 라이브러리는 다른 dll을 참조합니다. ㅇㅅㅇ