C#

CIL 의 메타데이터 파고들기

kark 2025. 4. 22. 16:22
728x90

메타데이터란?


컴파일시 C#의 중간언어파일 CIL은 명령어들의 중간언어만 포함된것 뿐만 아니라 메타데이터 또한 포함되어있습니다.

이 테이터는 데이터에 대한 정보를 나타내는 데이터로, 빌드로 부터 얻어낸 파일에는 코드, 명령어 뿐만 아니라 이런 메타데이터까지 포함됩니다.

메타데이터의 종류로는 어셈블리, 클래스 이름, 변수, 메서드, 상속구조 등을 나타냅니다.

이러한 데이터를 통해 C#의 리플렉션 기능을 활용할 수 있게 됩니다.


 

 

메타데이터는 그럼 리플렉션을 활용하기 위해 만들어진건가요?


메타데이터는 CLR이 프로그램을 메모리에 올릴때 상속 구조가 어떤지, 필드는 뭔지, 메서드는 어떤게 있는지 파악하기 위해 활용됩니다.

즉 프로그램을 동작하는데 참조에 대한 정보를 나타내는 참조 설명서이라고 보시면 됩니다.

또한 CLR이 가비지 컬렉션을 동작할 때 대상 객체의 메모리를 회수하기 앞서 참조관계를 파악하는 작업을 수행할 수 있게 됩니다.


 

 

코드를 작성할때는 메타데이터가 없는시점인데 어떻게 리플렉션을 통한 코드작성이 가능한건가요?


일반적인 코드나 함수는 컴파일시 전부 참조를 정적으로 연결하게 됩니다.

반면 리플렉션을 활용한 코드는 앞으로 어떻게 참조를 연결할지 계획만 작성해두는 것으로

메타데이터가 이미 구성된 이후의 시점인, 런타임 중에 리플렉션으로 작성된 코드가 계획에 따라 동적으로 바인딩 되는 구조입니다.


 

 

이 메타데이터는 어디에 저장되나요?


프로그램 실행 시 운영체제로부터 필요한 메모리공간을 할당받는 영역 외 별도의 메모리 공간을 할당받게 되어

메타데이터를 따로 관리할 수 있는 별도의 메타데이터 테이블 공간이 형성됩니다.