다음을 통해 공유


메타데이터 API 개요

업데이트: 2007년 11월

CLR(공용 언어 런타임) 메타데이터 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 메서드에서는 메타데이터를 내보내는 도구 및 서비스가 공용 형식 시스템에 요약된 개체 시스템 규칙을 적용하고 있으며 개발 시 메타데이터 엔진에 의한 추가 검사는 불필요한 것으로 가정합니다.

참고 항목

기타 리소스

메타데이터 개요