다음을 통해 공유


메타데이터 토큰

메타데이터는 런타임 형식(클래스, 값 형식 및 인터페이스), 전역 함수 및 전역 변수를 비롯한 추상화에 대한 선언적 정보입니다. 메타데이터는 테이블에 저장됩니다. 각 추상화 범주마다 테이블이 하나씩 만들어지고 추상화의 각 선언마다 테이블 행이 하나씩 만들어집니다. mdToken 형식의 개체인 토큰은 추상화에 대한 메타데이터가 들어 있는 레코드를 찾는 데 사용됩니다. 메타데이터 엔진에서는 토큰을 사용하여 지정된 메타데이터 범위의 특정 메타데이터 테이블로 인덱싱합니다.

메타데이터 토큰 구조

메타데이터 토큰은 4바이트 값입니다. MSB(최상위 바이트)는 토큰 형식을 지정하므로 추상화 및 관련 메타데이터 테이블을 식별합니다. 예를 들어 MSB 값 1은 해당 토큰이 형식 참조를 나타내는 mdTypeRef 토큰이고 해당 메타데이터는 TypeRef 메타데이터 테이블에 저장되어 있음을 의미하며, 값 4는 mdFieldDef 토큰에 해당합니다. CorTokenType 열거형은 토큰 형식을 지정하는 데 사용됩니다.

하위 3바이트는 RID(레코드 식별자)라고 하며 토큰의 MSB가 참조하는 메타데이터 테이블 내의 행 인덱스를 포함합니다. 예를 들어 값이 0x02000007인 메타데이터 토큰은 현재 범위에 있는 TypeDef 테이블의 7행을 나타냅니다. 마찬가지로 토큰 0x0400001A는 현재 범위에 있는 FieldDef 테이블의 26행(10진수)을 나타냅니다. 메타데이터 테이블의 0행에는 데이터가 없으므로 RID가 0인 메타데이터 토큰은 nil 토큰을 나타냅니다. 메타데이터 API는 값이 0x01000000인 mdTypeRefNil과 같이 각 토큰 형식에 대해 이러한 nil 토큰의 호스트를 하나씩 정의합니다.

참고참고

위의 RID에 대한 설명은 개념적인 것으로, 메타데이터의 실제 레이아웃은 휠씬 더 복잡합니다.또한 위의 설명과는 달리 문자열 토큰인 mdString의 경우 하위 3바이트는 레코드 식별자가 아니라 메타데이터 문자열 풀에서의 문자열 시작 위치에 대한 오프셋입니다.

메타데이터 토큰 사용

메타데이터 API의 각 DefineXXX 메서드는 관련 특성을 가져오기 위한 GetXXX 메서드에 전달할 수 있는 토큰을 반환합니다.

메타데이터 토큰은 범위 내에서 정의됩니다. 예를 들어 값이 N인 메타데이터 토큰은 특정 범위 내에서 형식 정의에 대한 자세한 정보가 들어 있는 레코드를 완전하게 식별합니다. 그러나 다른 범위에서는 동일하게 값이 N인 메타데이터 토큰이 완전히 다른 레코드를 지정할 수 있습니다.

메타데이터 토큰은 변경 불가능한 메타데이터 개체 식별자가 아니므로 두 개의 범위가 병합될 때는 가져온 범위의 토큰이 내보낸 범위의 토큰에 다시 매핑됩니다. 메타데이터 범위를 저장할 때 다양한 형식 최적화를 통해 토큰을 다시 매핑할 수 있습니다.

토큰 형식

다음 표에서는 메타데이터 토큰 형식, 각 토큰 형식이 나타내는 추상화 및 추상화의 메타데이터가 들어 있는 메타데이터 테이블의 이름을 보여 줍니다. 모든 토큰 형식은 기본 토큰 형식인 mdToken의 변형입니다.

토큰 형식

메타데이터 테이블

추상화

mdModule

모듈

모듈: 컴파일 단위, 실행 파일 또는 그 밖의 일부 개발 단위, 배포 단위 또는 런타임 단위입니다. 이름, GUID, 사용자 지정 특성 등을 비롯한 모듈 전체의 특성을 선언할 수 있습니다. 반드시 필요하지는 않습니다.

mdModuleRef

ModuleRef

모듈 참조: 모듈에 대한 컴파일 타임 참조로, 형식 및 멤버 가져오기의 소스가 기록됩니다.

mdTypeDef

TypeDef

형식 선언: 런타임 참조 형식(클래스 또는 인터페이스)이나 값 형식의 선언입니다.

mdTypeRef

TypeRef

형식 참조: 런타임 참조 형식이나 값 형식에 대한 참조입니다. 모듈의 형식 참조 컬렉션은 컴파일 타임 가져오기 종속성의 컬렉션이기도 합니다.

mdMethodDef

MethodDef

메서드 정의: 클래스 또는 인터페이스의 멤버이거나 전역 모듈 수준 메서드인 메서드의 정의입니다.

mdParamDef

ParamDef

매개 변수 선언: 매개 변수에 대한 추가 메타데이터를 저장하는 선택적 데이터 구조의 정의입니다. 메서드의 각 매개 변수에 대해 데이터 구조를 내보낼 필요는 없습니다. 그러나 마샬링 또는 형식 매핑 정보와 같이 매개 변수에 대해 저장할 추가 메타데이터가 있는 경우에는 선택적 매개 변수 데이터 구조를 만들 수 있습니다.

mdFieldDef

FieldDef

필드 선언: 클래스 또는 인터페이스의 데이터 멤버인 변수의 선언이거나 전역 모듈 수준 변수의 선언입니다.

mdProperty

Property

속성 선언: 클래스 또는 인터페이스의 멤버인 속성의 선언입니다.

mdEvent

Event

이벤트 선언: 클래스 또는 인터페이스의 멤버인 명명된 이벤트의 선언입니다.

mdMemberRef

MemberRef

멤버 참조: 메서드 또는 필드에 대한 참조입니다. 멤버 참조는 현재 모듈의 구현에 의해 수행되는 모든 메서드 호출 또는 필드 액세스에 대해 메타데이터에 생성되며, 토큰은 MSIL(Microsoft Intermediate Language) 스트림에 저장됩니다. 속성 또는 이벤트 참조는 런타임에서 지원되지 않습니다.

mdIfaceImpl

IfaceImpl

인터페이스 구현: 특정 클래스에서의 특정 인터페이스 구현입니다. 이 메타데이터 추상화를 통해 클래스와 인터페이스 중 어느 쪽에도 해당하지 않는 교차 부분의 정보를 저장할 수 있습니다.

mdMethodImpl

MethodImpl

메서드 구현: 특정 클래스에서 인터페이스 상속을 사용하여 상속된 메서드의 구현입니다. 이 메타데이터 추상화를 통해 계약 대신 구현과 관련된 정보를 저장할 수 있습니다. 메서드 선언 정보는 구현 클래스에서 수정할 수 없습니다.

mdCustomAttribute

CustomAttribute

사용자 지정 특성: mdToken으로 참조할 수 있는 메타데이터 개체와 연결된 임의의 데이터 구조입니다. 단, 사용자 지정 특성 자체에는 사용자 지정 특성이 포함될 수 없습니다.

mdPermission

권한

권한 집합: mdTypeDef, mdMethodDefmdAssembly와 연결된 선언적 보안 권한 집합입니다. 자세한 내용은 선언적 보안 지원 추가를 참조하십시오.

mdTypeSpec

TypeSpec

형식 생성자: 형식을 사용하는 MSIL 명령에 입력으로 사용할 수 있는 형식(예: boxed 값 형식)에 대한 토큰을 가져오는 메서드입니다.

mdSignature

시그니처

독립 실행형 시그니처: PE 파일(이식 가능 파일)의 지역 변수 시그니처나 MSIL 명령에 전달되는 메서드 시그니처입니다.

mdString

String

사용자 문자열: MSIL 명령에 전달되는 문자열입니다.

참고참고

위의 목록에는 필드 참조용 토큰 형식과 메서드 참조용 토큰 형식이 포함되어 있지 않습니다.필드 및 메서드 참조는 동일한 테이블을 공유하며 mdMemberRef 토큰 형식을 사용하여 참조할 수 있습니다.

확장성 및 추상화

런타임 메타데이터는 확장 가능하며 이 확장성은 다음과 같은 경우에 중요합니다.

  • CLS(공용 언어 사양)에 정의된 제약 조건이나 고급 추상화를 나타내려는 경우. CLS는 다양한 언어 및 도구에서 보다 효율적인 언어 통합을 일관된 방식으로 지원하기 위해 마련한 규칙 사양 동의안입니다. CLS는 공용 형식 시스템 모델의 여러 부분을 제한할 수 있으며, CLS를 통해 공용 형식 시스템의 상위 계층에 있는 고급 추상화를 도입할 수 있습니다. 메타데이터는 추상화가 런타임에서 명시적으로 인식되거나 지원되지 않더라도 도구에서 사용되는 이러한 개발 시 추상화 형식을 캡처할 수 있어야 합니다.

  • 공용 형식 시스템의 일부가 아니고 CLS 추상화가 아닌 언어별 추상화를 나타내려는 경우. 이 경우 Visual C와 같은 언어에서 별도의 헤더 파일이나 IDL 파일 없이도 컴파일된 모듈에서 내보낸 형식, 메서드 및 데이터 멤버를 사용할 수 있습니다.

  • 언어별 오버로드에 사용된 멤버 내 시그니처 형식과 형식 한정자를 인코딩하려는 경우

메타데이터 확장성은 다음과 같은 형태로 나타납니다.

  • 모든 메타데이터 개체는 사용자 지정 특성을 지원할 수 있으며 메타데이터 API를 통해 사용자 지정 특성을 선언, 열거 및 검색할 수 있습니다. 사용자 지정 특성은 형식 참조(mdTypeDefmdTypeRef)로 식별할 수 있습니다. 사용자 지정 특성의 구조는 형식에 선언된 데이터 멤버를 사용하여 자체 설명되며, 값 인코딩은 런타임 리플렉션 서비스 등의 도구를 사용하여 찾을 수 있습니다.

  • 공용 형식 시스템을 확장할 수 있을 뿐 아니라 사용자 지정 한정자를 멤버 시그니처로 내보낼 수도 있습니다. 런타임에서는 메서드 오버로딩, 숨기기 및 바인딩에 이러한 한정자를 사용하지만 언어별 의미 체계를 적용하지는 않습니다.

참고 항목

개념

메타데이터 개요