메타데이터 개요

메타데이터를 사용하면 런타임 형식(클래스, 인터페이스 및 값 형식), 필드 및 메서드를 기술할 수 있을 뿐 아니라 CLR(공용 언어 런타임)에서 사용되는 내부 구현 및 레이아웃 정보도 기술할 수 있습니다. 런타임에서는 메타데이터를 사용하여 MSIL(Microsoft Intermediate Language)을 JIT 컴파일하고, 클래스를 로드하고, 코드를 실행하고, COM 고유의 기술과 상호 작용합니다. 메타데이터는 모든 CLR 구성 요소에 포함되며 런타임, 도구 및 서비스에서 사용할 수 있습니다.

이 개요는 다음과 같은 단원으로 구성됩니다.

  • 메타데이터 API

  • 리플렉션 서비스와 비교

  • 범위

  • 오류 검사

  • 관련 항목

메타데이터 API

모든 메타데이터 조작 작업은 메타데이터 API를 통해 수행됩니다. 메타데이터 API는 클라이언트(도구 및 서비스)를 내부 데이터 구조로부터 격리시키며, 런타임 이진 표현, COM 기본 형식 라이브러리 및 기타 형식과 메모리 간의 투명한 전송을 가능하게 하는 플러그형 지속성 형식을 제공합니다.

메타데이터 API에는 메타데이터 내보내기(생성) 및 가져오기를 수행하는 인터페이스가 포함되어 있습니다. 클라이언트에서는 다음 방법으로 메타데이터를 내보내거나 가져올 수 있습니다.

  • 컴파일러 및 도구에서 내보내기 API를 호출하여 메타데이터를 내보냅니다. 메타데이터는 컴파일 및 연결 프로세스 도중에 내보내집니다. RAD 도구에서는 구성 요소나 응용 프로그램을 빌드하는 과정에서 메타데이터를 내보냅니다. 이 API 멤버는 메모리 내 데이터 구조에 대한 쓰기 및 읽기 작업을 수행합니다. 저장 시 이러한 메모리 내 구조는 압축된 후 대상 컴파일 단위(.obj 파일), 실행 파일(.exe 파일) 또는 독립 실행형 메타데이터 이진 파일에 이진 형식으로 저장됩니다. 여러 개의 컴파일 단위가 연결되어 EXE나 DLL을 구성하는 경우 내보내기 API 멤버는 각 컴파일 단위의 메타데이터 섹션을 하나의 통합된 메타데이터 이진 파일에 병합하는 메서드를 제공합니다.

  • 로더와 그 밖의 런타임 도구 및 서비스에서는 로드 및 활성화와 같은 작업이 완료될 수 있도록 구성 요소에 대한 정보를 가져오는 API 멤버를 호출하여 메타데이터를 가져옵니다.

맨 위로 이동

리플렉션 서비스와 비교

메타데이터 API를 사용하면 런타임에서 클래스를 로드하지 않아도 구성 요소의 메타데이터에 액세스할 수 있습니다. 이 API는 성능을 최적화하고 오버헤드를 최소화하도록 디자인되었습니다. 메타데이터 엔진에서는 데이터를 사용할 수 있게 하면서도 메모리 내 데이터 구조에 직접 액세스할 수 있게 하지는 않습니다. 반면, 런타임에 클래스가 로드될 때 로더에서는 런타임의 리플렉션 서비스를 사용하여 탐색할 수 있는 고유한 데이터 구조로 메타데이터를 가져옵니다.

리플렉션 서비스에서는 자동으로 상속 계층 구조를 탐색하여 상속된 메서드 및 필드에 대한 정보를 가져오는 등 메타데이터 API보다 더 많은 작업을 수행합니다. 메타데이터 API의 경우에는 특정 클래스에 대한 직접 멤버 선언만 반환하므로 계층 구조를 탐색하고 상속된 메서드를 열거하려면 API 클라이언트에서 추가로 호출해야 합니다. 리플렉션 서비스를 사용할 경우에는 보다 세부적인 수준의 메타데이터 보기가 제공되는 반면, 메타데이터 API를 사용할 경우에는 API 클라이언트에서 데이터 구조 탐색을 완전하게 제어할 수 있습니다.

맨 위로 이동

범위

특정 시점에 메타데이터가 들어 있는 고유한 메모리 영역이 여러 개 있을 수 있습니다. 예를 들어, 디스크에 있는 기존 모듈의 모든 메타데이터를 매핑하는 하나의 영역이 있는 상태에서 나중에 모듈로 파일에 저장할 메타데이터를 별도의 영역으로 내보낼 수 있습니다.

참고참고

여기서 모듈이란 메타데이터를 포함하는 파일을 의미하며,일반적으로 메타데이터와 MSIL(Microsoft Intermediate Language) 코드가 모두 들어 있는 .obj, .exe 또는 .dll 파일이 이에 해당됩니다. 그러나 메타데이터만 들어 있는 파일도 모듈이 될 수 있습니다.

메모리에 있는 개별 메타데이터 영역을 범위라고 합니다. 각 범위는 하나의 모듈에 해당합니다. 모듈은 대개 디스크에 파일로 저장되지만 그렇지 않은 경우도 있습니다. 예를 들어, 스크립팅 도구에서는 종종 파일로 저장할 수 없는 메타데이터를 생성하기도 합니다.

범위는 메타데이터 토큰이 정의된 영역을 나타내는 데 적합하기 때문에 사용되는 용어입니다. 예를 들어 값이 N인 메타데이터 토큰은 특정 범위 내의 클래스 정의에 대한 세부 정보를 식별합니다. 그러나 범위가 다를 경우에는 동일하게 값이 N인 메타데이터 토큰이 완전히 다른 세부 정보 집합에 해당할 수 있습니다.

메모리에서 메타데이터 범위를 설정하려면 IMetaDataDispenser 인터페이스의 CComPtrBase::CoCreateInstance 메서드를 호출합니다. 이 메서드는 새 범위를 만들거나 파일 또는 메모리 위치에서 기존 메타데이터 구조체 집합을 엽니다. 호출자는 IMetaDataDispenser::DefineScope 또는 IMetaDataDispenser::OpenScope 메서드를 호출할 때마다 다음 중에서 받을 API를 지정합니다.

  • IMetaDataEmit 인터페이스를 사용하면 도구로 메타데이터 범위에 쓸 수 있습니다.

  • IMetaDataEmit 인터페이스를 사용하면 도구로 메타데이터 범위에서 읽을 수 있습니다.

맨 위로 이동

오류 검사

메타데이터 API는 최소한의 의미 오류 검사를 수행합니다. 메타데이터 API 메서드에서는 메타데이터를 내보내는 도구 및 서비스가 공용 형식 시스템에 요약된 개체 시스템 규칙을 적용하고 있으며 개발 시 메타데이터 엔진에 의한 추가 검사는 불필요한 것으로 가정합니다.

맨 위로 이동

관련 항목

제목

설명

메타데이터 토큰

추상화를 식별하는 데 사용되는 메타데이터 토큰에 대한 정보를 제공하고 메타데이터 API에서 메타데이터 토큰을 사용되는 방법에 대해 설명합니다.

메타데이터 API의 코딩 규칙

메타데이터 API에 사용되는 코딩 규칙을 설명합니다.

메타데이터 인터페이스

.NET Framework 형식, 메서드, 필드 등에 의해 노출되는 메타데이터에 액세스하는 데 사용할 수 있는 관리되지 않는 인터페이스를 설명합니다.

메타데이터 전역 정적 함수

메타데이터 API에 사용되는 관리되지 않는 전역 정적 함수를 설명합니다.

메타데이터 열거형

메타데이터 API에 사용되는 관리되지 않는 열거형을 설명합니다.

메타데이터 구조체

메타데이터 API에 사용되는 관리되지 않는 구조체를 설명합니다.

메타데이터 공용 구조체

메타데이터 API에 사용되는 관리되지 않는 공용 구조체를 설명합니다.

맨 위로 이동