WinMD(Windows 메타데이터) 파일

WinRT(Windows 런타임) API는 확장 .winmd 명(Windows 메타데이터라고도 함)이 있는 컴퓨터에서 읽을 수 있는 메타데이터 파일에 설명되어 있습니다. 이러한 메타데이터 파일은 언어 프로젝션을 사용하도록 설정하기 위해 도구 및 언어 프로젝션에서 사용됩니다.

일반 사항

Windows 모든 시스템 제공 WinRT API에 대한 메타데이터를 포함합니다. Windows 런타임에 이 메타데이터가 필요한 네임스페이스 및 형식의 해상도에서 언어 프로젝션을 지원하는 API를 제공합니다. Windows SDK는 컴파일 시간에 이 메타데이터가 필요한 언어 프로젝션에서 사용할 시스템 메타데이터의 복사본을 단일 파일에 제공합니다.

타사에서는 제공된 시스템처럼 언어 프로젝션에 참여할 수 있는 자체 WinRT API를 개발할 수 있습니다. 타사 WinRT API는 시스템 API와 마찬가지로 메타데이터를 제공해야 합니다. 네임스페이스 및 형식 확인에 대한 Windows API는 시스템 메타데이터와 마찬가지로 타사 메타데이터에서 작동합니다.

WinMD 파일의 모든 공용 형식은 WinRT 형식이어야 하며 tdWindowsRuntime 플래그(따라야 할 형식 플래그에 대한 세부 정보)를 전달해야 합니다. WinMD 파일에는 WinRT가 아닌 형식에 대한 메타데이터가 포함될 수 있습니다. WinMD 파일의 WinRT가 아닌 형식은 공용이 아니어야 합니다. 비 WinRT 형식에 대한 의미 체계는 구현에 정의되어 있으며 이 문서의 범위 밖에 있습니다.

WinRT 형식의 모든 공용 인터페이스 멤버(메서드, 속성 및 이벤트)는 WinRT 인터페이스 멤버여야 합니다. WinRT 형식에는 비 WinRT 인터페이스 멤버에 대한 메타데이터가 포함될 수 있습니다. WinRT가 아닌 인터페이스 멤버는 공용이 아닐 수 있습니다. 비 WinRT 인터페이스 멤버에 대한 의미 체계는 구현에 정의되어 있으며 이 문서의 범위 밖에 있습니다.

WinMD 파일

WinMD 파일 형식

WinMD 파일은 ECMA-335 사양에 정의된 CLR(공용 언어 런타임) 어셈블리와 동일한 물리적 파일 형식을 사용합니다. 그러나 실제 파일 형식은 동일하지만 WinMD 파일 및 CLR 어셈블리에 대해 유효한 데이터 조합에 대한 규칙은 다릅니다. 이 문서에서는 WinMD 파일과 CLR 어셈블리 간의 델타를 나열합니다.

시스템 제공 WinMD 파일은 순수 메타데이터입니다. 타사 WinMD 파일에는 코드가 포함될 수 있습니다. 특히 관리형 WinMD 파일에는 기존 CLR 어셈블리와 마찬가지로 MSIL(Microsoft Intermediate Language) 코드가 포함됩니다.

모든 WinMD 파일에는 0개 이상의 WinRT 형식 정의가 포함됩니다. 빈 WinMD 파일은 기술적으로 유효합니다.

WinMD에 나열된 PEKind 또는 머신 아키텍처에 대한 특정 WinRT 제한은 없습니다.

WinMD 버전 문자열에는 "Windows 런타임 1.2"가 포함되어야 합니다.

WinMD 파일 이름

WinMD 파일의 이름(확장명 없음)은 WinMD 파일 내 어셈블리 테이블의 이름 열과 대/소문자를 구분하지 않아야 합니다. 예를 들어 "Foo.Bar.winmd" 파일은 어셈블리 테이블의 이름 열에 "Foo.Bar"이 있어야 합니다. 파일 시스템은 대/소문자를 구분하지 않으므로 파일 이름의 대/소문자가 어셈블리 테이블 이름 열 값과 다를 수 있습니다.

지정된 WinMD 파일의 모든 WinRT 형식은 WinMD 파일의 이름 및 어셈블리 테이블 이름 열 값과 일치하는 네임스페이스 아래에 있어야 합니다. 파일 시스템은 대/소문자를 구분하지 않으므로 파일 이름의 대/소문자가 지정된 WinMD 파일의 모든 WinRT 형식의 네임스페이스와 다를 수 있습니다. 지정된 WinMD에 있는 모든 WinRT 형식의 네임스페이스는 어셈블리 테이블 이름 열 값과 정확히 일치해야 합니다(즉, 대/소문자를 구분). 예를 들어 어셈블리 테이블의 이름 열에 "Foo.Bar"이 있는 파일의 모든 형식은 "Foo.Bar" 네임스페이스에 있어야 합니다. 형식은 이 네임스페이스의 직접 자식(예: Foo.Bar.MyType) 또는 이 네임스페이스의 하위 네임스페이스(예: Foo.Bar.Baz.MyType)일 수 있습니다. 파일 이름은 "Foo.Bar.winmd"여야 하지만 경우에 따라 달라질 수 있습니다. 즉, "foo.bar.winmd" 및 "FOO"입니다. 바. WINMD"는 이 메타데이터 파일의 파일 이름으로도 허용됩니다.

WinMD 컴퍼지션

시스템의 모든 형식에 대한 메타데이터는 여러 .winmd 파일에 분산됩니다. AppX 패키지에는 애플리케이션 패키지에 포함된 타사 WinRT 구성 요소를 설명하는 0개 이상의 .winmd 파일이 포함될 수 있습니다.

시스템에서 제공하거나 지정된 앱에 포함된 모든 .winmd 파일에서 모든 WinRT 형식의 메타데이터는 형식의 네임스페이스와 일치하는 가장 긴 이름의 WinMD 파일에 저장되어야 합니다. 지정된 네임스페이스의 직접 자식인 모든 형식은 동일한 파일에 있어야 합니다. 예를 들어 AppX 패키지에 Foo.winmd 및 Foo.Bar.winmd 파일이 포함된 경우 Foo.Bar.Baz.MyType 형식은 패키지의 형식에 대한 네임스페이스와 일치하는 파일 이름이 가장 긴 파일이므로 Foo.Bar.winmd 파일에 있어야 합니다.

TypeDef 리디렉션

시스템에서 제공하는 메타데이터 파일은 TypeDefs를 직접 참조하지 않습니다. 동일한 메타데이터 파일에 정의된 형식을 참조하는 경우에도 시스템 메타데이터 파일은 항상 TypeDef를 참조하는 TypeRef를 참조합니다. CLR 형식 리디렉션을 지원하기 위해 수행됩니다(예: IVectorT<>IListT<>로 프로젝션).

타사 메타데이터 파일은 TypeDef를 직접 사용하거나 시스템 메타데이터 파일과 유사한 TypeRef를 통해 모든 형식 참조를 리디렉션할 수 있습니다.

형식 시스템 인코딩

mscorlib 어셈블리의 시스템 네임스페이스에서 이 문서의 모든 형식은 WinRT에서 표식으로 사용됩니다. 이러한 형식은 형식에 대한 정보를 나타내는 데 사용되며 확인되지 않아야 합니다. 여기에는 System.Object, System.Guid, System.ValueType, System.Enum, System.MulticastDelegate 및 System.Attribute가 포함됩니다(이에 국한되지 않음). 이러한 이름은 CLR과의 호환성을 위해 선택되었습니다. 이러한 형식에 대한 CLR의 정의는 해당 형식 시스템의 일부이며 WinRT와는 아무 상관이 없습니다.

여기에 설명된 많은 구문은 C# 구문을 사용합니다. 이는 단순히 C# 구문을 사용하여 특정 CLI(공용 언어 인프라) 메타데이터 구문을 나타내는 것이 편리하기 때문입니다. 실제 구문은 순수 CLI 메타데이터 구문입니다.

네임스페이스

WinRT는 형식의 네임스페이스와 로컬 이름을 하나의 기간으로 구분된 문자열로 인코딩합니다. 예를 들어 이 코드 조각에 정의된 형식은 "Windows. Foundation.ISimpleInterface".

namespace Windows {
    namespace Foundation {
        interface ISimpleInterface {
            HRESULT Method1(int paramOne);
        };
    };
};

공간 최적화를 위해 CLI 메타데이터의 TypeDef 테이블은 형식 이름과 네임스페이스 이름에 대해 별도의 열을 제공합니다. 그러나 API 수준에서 TypeDef 속성은 형식 이름만 노출합니다.

기본 형식

Guid를 제외한 모든 WinRT 기본 형식에는 CLI 메타데이터 Blob 및 기타 형식 참조에 사용할 명시적 상수 값이 있습니다. 이러한 상수 값은 CLI 사양의 파티션 2, 섹션 23.1.16에 설명되어 있습니다.

WinRT 유형 CLI 요소 형식 이름 CLI 요소 형식 값
Int16 ELEMENT_TYPE_I2 0x06
Int32 ELEMENT_TYPE_I4 0x08
Int64 ELEMENT_TYPE_I8 0x0a
UInt8 ELEMENT_TYPE_U1 0x05
UInt16 ELEMENT_TYPE_U2 0x07
UInt32 ELEMENT_TYPE_U4 0x09
UInt64 ELEMENT_TYPE_U8 0x0b
Single ELEMENT_TYPE_R4 0x0c
Double ELEMENT_TYPE_R8 0x0d
Char16 ELEMENT_TYPE_CHAR 0x03
부울 ELEMENT_TYPE_BOOL 0x02
String ELEMENT_TYPE_STRING 0x0e

명시적 ELEMENT_TYPE_* 상수 값이 없으므로 guid는 메타데이터에서 mscorlib 어셈블리의 System.Guid 형식에 대한 TypeRef로 표시됩니다.

열거형

열거형은 다음과 같이 열이 설정된 TypeDef 테이블(ECMA II.22.37)에서 행으로 표시됩니다.

  • 플래그. 공용 | 설정 봉인된 | tdWindowsRuntime(0x4101).
  • 이름. 형식의 이름을 포함하는 문자열 힙의 인덱스입니다.
  • 네임스페이스. 형식의 네임스페이스를 포함하는 문자열 힙의 인덱스입니다.
  • 확장. mscorlib 어셈블리에서 System.Enum 클래스를 참조하는 TypeRef로 설정합니다.
  • FieldList. 필드 테이블에 대한 인덱스로, 이 형식이 소유한 필드의 연속 실행 중 첫 번째를 표시합니다.
  • MethodList. 비어 있어야 합니다.

열거형에는 열거형의 기본 정수 형식과 0개 이상의 정적 필드를 지정하는 단일 인스턴스 필드가 있습니다. 열거형 형식으로 정의된 각 열거형 값에 대해 하나씩

열거형의 기본 정수 형식은 형식과 연결된 필드 테이블(ECMA II.22.15)의 첫 번째 행(즉, 위에 지정된 FieldList 열에서 참조된 행)으로 나타납니다. 열거형 형식에 대한 필드 테이블의 열은 다음과 같습니다.

  • 플래그: 프라이빗 | SpecialName | RTSpecialName(0x601).
  • 이름: "value__" 이름을 포함하는 문자열 힙의 인덱스입니다.
  • 서명: WinRT 열거형 값은 32비트 정수 또는 부호 없는 32비트 정수여야 하므로 Type이 ELEMENT_TYPE_I4 또는 ELEMENT_TYPE_U4 설정되는 FieldSig Blob(ECMA II.23.2.4)이 포함된 Blob 힙의 인덱스입니다.

열거형 값 정의가 제공된 후 열거형의 각 값에 대한 필드 정의가 제공됩니다.

  • 플래그: 공용 | 정적 | 리터럴 | hasdefault(0x8056).
  • 이름: 열거형 값의 이름을 포함하는 문자열 힙의 인덱스입니다.
  • 서명: Type이 열거형 형식의 TypeDef로 설정된 FieldSig Blob(ECMA II.23.3.4)을 포함하는 Blob 힙의 인덱스입니다.

각 열거형 값 정의에 대해 열거형 값의 정수 값을 저장할 상수 테이블(ECMA II.22.9)에 해당 행이 있습니다.

  • 을 입력한 다음 ELEMENT_TYPE_I4 또는 ELEMENT_TYPE_U4 열거형의 기본 형식을 나타내는 1바이트, ECMA 사양에 따라 1바이트 패딩 0이 뒤따릅니다.
  • 부모: 연결된 열거형 값 레코드를 보유하는 필드 테이블의 인덱스입니다.
  • 값: 열거형 값의 정수 값을 보유하는 Blob 테이블에 대한 인덱스입니다.

또한 기본 UInt32 형식의 열거형에 대해 System.FlagsAttribute를 열거형 TypeDef 행에 추가해야 합니다. 기본 Int32 형식의 열거형에 대해 FlagsAttribute를 열거형 TypeDef 행에 추가하면 안 됩니다.

시스템에서 제공하는 모든 열거형의 경우 VersionAttribute를 열거형 TypeDef 행에 추가해야 합니다. 필요에 따라 VersionAttribute를 정적 필드 행에 추가할 수 있습니다. 있는 경우 열거형 필드 행에 있는 VersionAttribute의 버전 값은 열거형 TypeDef 행의 VersionAttribute 값보다 크거나 같아야 합니다.

구조체

구조체는 다음과 같이 열이 설정된 TypeDef 테이블(ECMA II.22.37)에서 행으로 구현됩니다.

  • 플래그 – 공용 | 봉인된 | 순차 | tdWindowsRuntime(0x4109).
  • 이름 - 형식의 이름을 포함하는 문자열 힙의 인덱스입니다.
  • 네임스페이스 - 형식의 네임스페이스를 포함하는 문자열 힙의 인덱스입니다.
  • Extends – mscorlib 어셈블리에서 System.ValueType 클래스를 참조하는 TypeRef로 설정됩니다.
  • FieldList – 필드 테이블의 인덱스로, 이 형식이 소유한 필드의 연속 실행 중 첫 번째를 표시합니다.
  • MethodList – 비어 있어야 합니다.

구조체에는 하나 이상의 필드 테이블 항목이 있습니다.

  • 플래그: public.
  • 이름: 필드 이름을 포함하는 문자열 힙의 인덱스입니다.
  • 서명: 형식이 필드 형식의 메타데이터 토큰으로 설정된 FieldSig Blob(ECMA II.23.2.4)을 포함하는 Blob 힙의 인덱스입니다.
    • 구조체 필드는 기본 형식, 열거형 또는 기타 구조체여야 합니다.

시스템에서 제공하는 모든 구조체의 경우 VersionAttribute를 구조체 TypeDef 행에 추가해야 합니다.

대리자

대리자는 다음과 같이 열이 설정된 TypeDef 테이블(ECMA II.22.37)에서 행으로 구현됩니다.

  • 플래그: 공용 | 설정 봉인된 | tdWindowsRuntime(0x4101).
  • 이름 - 형식의 이름을 포함하는 문자열 힙의 인덱스입니다.
  • 네임스페이스 - 형식의 네임스페이스를 포함하는 문자열 힙의 인덱스입니다.
  • Extends: mscorlib 어셈블리에서 System.MulticastDelegate 클래스를 참조하는 TypeRef로 설정합니다.
  • FieldList: 비어 있어야 합니다.
  • MethodList: MethodDef 테이블(ECMA II.22.26)에 대한 인덱스로, 이 형식이 소유한 메서드의 연속 실행 중 첫 번째를 표시합니다.

대리자 TypeDef 행에는 GuidAttribute가 있어야 합니다.

대리자는 정확히 두 개의 MethodDef 테이블 항목을 갖습니다. 첫 번째는 생성자를 정의합니다. 이 생성자는 호환성 표식이므로 네이티브 int와 같은 WinRT가 아닌 구문과 둘 다 in 아닌 out매개 변수를 사용합니다. WinRT 대리자에는 이러한 생성자 메서드가 없습니다.

  • RVA: 0(추상 구문).
  • ImplFlags: 런타임(0x03).
  • 플래그: 프라이빗 | hidebysig | specialname | RTSpecialName(0x1881).
  • 이름: ".ctor"라는 이름을 포함하는 문자열 테이블의 인덱스입니다.
  • 서명: 메서드에 대한 MethodDefSig Blob(ECMA II.23.2.1)을 포함하는 Blob 힙의 인덱스이며 매개 변수에는 네이티브 int가 있고 반환 값은 없습니다.
  • ParamList: 이 메서드와 연결된 Param 행 실행의 첫 번째 행을 포함하는 Param 테이블(ECMA II.22.33)의 인덱스입니다. Param 테이블의 각 행에는 다음 정보가 포함됩니다.
    • 개체 매개 변수
      • 시퀀스 1
      • 이름 "object"
      • 플래그: none(0x00)
    • 네이티브 Int 매개 변수
      • 시퀀스 2
      • 이름 "method"
      • 플래그: none(0x00)

두 번째 MethodDef 항목은 Invoke 메서드를 정의합니다.

  • RVA: 0(추상 구문)
  • ImplFlags: 런타임(0x03)
  • 플래그: 공용 | 가상 | HideBySig | specialname(0x08C6)
  • 이름: "Invoke"라는 이름이 포함된 문자열 테이블의 인덱스입니다.
  • 서명: 대리자의 매개 변수 형식 및 반환 형식을 포함하는 MethodDefSig Blob(ECMA II.23.2.1)을 포함하는 Blob 힙의 인덱스입니다. 대리자가 매개 변수화되면 MethodDefSig Blob은 GENERICINST로 인코딩된 형식(ECMA II.23.2.12에 따라)을 통해 각 대리자 형식 매개 변수를 참조해야 합니다. 따라야 할 매개 변수가 있는 대리자 세부 정보입니다.
  • ParamList: 이 메서드와 연결된 Param 행 실행의 첫 번째 행을 포함하는 Param 테이블(ECMA II.22.33)의 인덱스입니다. Param 테이블의 각 행에는 다음 정보가 포함됩니다.
    • 플래그 – 매개 변수에 적절한 인/아웃
    • Sequence – 매개 변수의 시퀀스 순서입니다. 0은 메서드의 반환 값에 대해 예약됩니다.
    • 이름 – 매개 변수의 이름을 포함하는 문자열 힙에 인덱싱합니다. 시스템에서 제공한 모든 대리자의 경우 VersionAttribute를 대리자의 TypeDef 행에 추가해야 합니다.

매개 변수가 있는 대리자

매개 변수가 있는 대리자는 다음과 같은 추가 요구 사항이 있습니다.

  • 매개 변수가 있는 대리자의 이름에는 백틱과 매개 변수가 있는 대리자가 갖는 형식 매개 변수 수를 나타내는 숫자가 추가됩니다. 예를 들어 Windows. Foundation.EventHandlerT<> 형식은 이름이 Windows 메타데이터에 저장됩니다. Foundation.EventHandler'1.
  • 매개 변수가 있는 대리자는 열이 다음과 같이 설정된 모든 형식 매개 변수에 대해 GenericParam 테이블(ECMA II.22.20)에 한 행이 있습니다.
    • Number: 제네릭 매개 변수의 인덱스(왼쪽에서 오른쪽으로 번호가 매겨진 경우 0부터 시작)입니다.
    • 플래그: 없음.
    • 소유자: 인터페이스를 포함하는 행의 TypeDef 테이블에 대한 인덱스입니다.
    • 이름: 제네릭 매개 변수의 이름을 포함하는 문자열 힙에 대한 인덱스입니다.

TypeSpec 테이블(ECMA II.23.2.14)은 매개 변수가 있는 대리자의 인스턴스를 정의하는 데 사용됩니다. 그런 다음 이러한 TypeSpecs를 TypeRefs와 유사하게 메서드 서명에 사용할 수 있습니다.

인터페이스

인터페이스는 다음과 같이 열이 설정된 TypeDef 테이블(ECMA II.22.37)에서 행으로 구현됩니다.

  • Flags:
    • 인터페이스 | public | 추상 | tdWindowsRuntime(0x40A1) 또는
    • 인터페이스 | NotPublic| 추상 | tdWindowsRuntime(0x40A0)
  • 이름: 인터페이스 이름을 포함하는 문자열 테이블의 인덱스입니다.
  • 네임스페이스 - 형식의 네임스페이스를 포함하는 문자열 힙의 인덱스입니다.
  • 확장: null입니다.
  • FieldList: 비어 있어야 합니다.
  • MethodList: 이 형식이 소유한 메서드의 연속 실행 중 첫 번째를 표시하는 MethodDef 테이블의 인덱스입니다. MethodDef 테이블의 내용에 대한 세부 정보는 현재 섹션의 하위 섹션에 자세히 설명되어 있습니다.

인터페이스의 TypeDef 행에는 GuidAttribute와 VersionAttribute가 있어야 합니다.

프라이빗 표시 유형이 있는 WinRT 인터페이스에는 단일 ExclusiveToAttribute가 있어야 합니다. 공용 표시 유형이 있는 WinRT 인터페이스에는 ExclusiveToAttribute가 없어야 합니다. 있는 경우 ExclusiveToAttribute는 런타임 클래스를 참조해야 합니다.

인터페이스에 필요한 인터페이스는 다음과 같이 열이 설정된 InterfaceImpl 테이블(ECMA II.22.23)의 행으로 표시됩니다.

  • 클래스: 인터페이스를 포함하는 행의 TypeDef 테이블에 대한 인덱스입니다.
  • 인터페이스: 필요한 인터페이스를 지정하는 TypeDef, TypeRef 또는 TypeSpec 테이블의 인덱스입니다. 시스템에서 제공하는 메타데이터 파일에서는 필요한 인터페이스가 동일한 메타데이터 파일에 정의되어 있더라도 TypeDef가 되지 않습니다. 자세한 내용은 TypeDef 리디렉션 섹션을 참조하세요.

매개 변수가 있는 인터페이스

매개 변수가 있는 인터페이스는 다음과 같은 추가 요구 사항을 충족합니다.

매개 변수가 있는 인터페이스의 이름은 백틱과 매개 변수가 있는 대리자가 갖는 형식 매개 변수 수를 나타내는 숫자와 함께 추가됩니다. 예를 들어 Windows. Foundation.Collections.IVectorT<> 형식은 이름이 Windows 메타데이터에 저장됩니다. Foundation.Collections.IVector'1.

매개 변수가 있는 인터페이스는 열이 다음과 같이 설정된 모든 형식 매개 변수에 대해 GenericParam 테이블(ECMA II.22.20)에 한 행이 있습니다.

  • Number: 제네릭 매개 변수의 인덱스(왼쪽에서 오른쪽으로 번호가 매겨진 경우 0부터 시작)입니다.
  • 플래그: 없음.
  • 소유자: 인터페이스를 포함하는 행의 TypeDef 테이블에 대한 인덱스입니다.
  • 이름: 제네릭 매개 변수의 이름을 포함하는 문자열 힙에 대한 인덱스입니다.

TypeSpec 테이블(ECMA II.23.2.14)은 매개 변수가 있는 인터페이스의 인스턴스를 정의하는 데 사용됩니다. 그런 다음 이러한 TypeSpecs를 TypeRefs와 유사하게 메서드 서명 및 인터페이스 구현에 사용할 수 있습니다.

인터페이스 멤버

배열 매개 변수

모든 인터페이스 멤버 형식에 대해 Array 매개 변수를 인코딩할 때 배열 매개 변수 바로 앞에 오는 배열 길이 매개 변수는 Params 테이블뿐만 아니라 MethodDefSig Blob 모두에서 생략됩니다.

배열 매개 변수의 방향은 메타데이터로 직접 인코딩됩니다. 배열 길이 매개 변수의 방향은 다음과 같이 유추될 수 있습니다.

  • 배열 매개 변수가 in 매개 변수인 경우 배열 길이 매개 변수도 in 매개 변수여야 합니다.
  • 배열 매개 변수가 out 매개 변수이고 BYREF 마커를 전달하지 않는 경우 배열 길이는 in 매개 변수입니다.
  • 배열 매개 변수가 out 매개 변수이고 BYREF 마커를 전달하는 경우 배열 길이는 out 매개 변수입니다.

메서드

CLR 호환성뿐만 아니라 메서드의 예상 프로젝션을 더 잘 모델링하기 위해 필요한 HRESULT 반환 값은 메타데이터로 인코딩되지 않습니다. 대신 반환 값으로 사용할 out 매개 변수는 methodDefSig의 반환 값으로 인코딩됩니다. 반환 값으로 사용할 out 매개 변수를 선언하지 않는 메서드의 경우 methodDefSig는 반환 형식을 void로 선언해야 합니다(ECMA II.23.2.11에 따라).

인터페이스의 각 메서드는 MethodDef 테이블에서 행으로 표시됩니다. 각 methoddef 행에는 다음 정보가 포함됩니다.

  • RVA: 0x00
  • ImplFlags: 0x00
  • 플래그: 공용 | 가상 | HideBySig | 추상 | NewSlot | 인스턴스(0x5c6)
  • 이름: 메서드 이름을 포함하는 문자열 테이블의 인덱스입니다.
  • 서명: 메서드의 매개 변수 형식 및 반환 형식을 포함하는 MethodDefSig Blob(ECMA II.23.2.1)을 포함하는 Blob 힙에 대한 인덱스입니다. 인터페이스가 매개 변수화되면 MethodDefSig Blob은 GENERICINST로 인코딩된 형식(ECMA II.23.2.12에 따라)을 통해 각 인터페이스의 형식 매개 변수를 참조해야 합니다. 따라야 할 매개 변수가 있는 인터페이스에 대한 세부 정보입니다.
  • ParamList: 이 메서드와 연결된 Param 행의 실행 중 첫 번째 행을 포함하는 Param 테이블(ECMA II.22.33)에 대한 인덱스입니다.

메서드의 각 매개 변수(지정된 경우 반환 값과 함께)는 Param 테이블(ECMA II.22.33)에 해당 행을 갖습니다.

  • 플래그 – 매개 변수에 적합한 형식 또는 출력이 없습니다.
    • 반환 값은 항상 없음
    • 다른 매개 변수는 항상 또는 외부에 있습니다.
  • Sequence – 매개 변수의 시퀀스 순서입니다.
    • 0은 메서드의 반환 값에 대해 예약됩니다.
  • 이름 – 매개 변수의 이름을 포함하는 문자열 힙에 인덱싱합니다.

각 메서드에는 필요에 따라 인터페이스 범위 내에서 고유한 메서드 이름을 전달하는 OverloadAttribute가 있을 수 있습니다. 각 메서드에는 필요에 따라 약하고 동적으로 형식화된 언어로 프로젝션되어야 하는 동일한 아리티(매개 변수 수)의 오버로드된 메서드를 나타내는 DefaultOverloadAttribute가 있을 수 있습니다.

속성

인터페이스의 각 속성은 속성(ECMA II.22.34), PropertyMap(ECMA II.22.35), MethodSemantics(ECMA II.22.28) 및 MethodDef(ECMA II.22.26) 테이블의 행으로 정의됩니다.

하나 이상의 속성이 있는 각 인터페이스는 다음 정보를 포함하는 PropertyMap 테이블의 단일 행으로 표시됩니다.

  • 부모: 속성을 포함하는 인터페이스를 포함하는 TypeDef 테이블의 인덱스입니다.
  • PropertyList: 이 형식과 연결된 행의 실행에서 첫 번째를 포함하는 속성 테이블의 인덱스입니다.

각 속성은 다음 정보를 포함하는 속성 테이블의 단일 행으로 표시됩니다.

  • 플래그: 없음.
  • 이름: 속성 이름을 포함하는 문자열 힙의 인덱스입니다.
  • 형식: 속성에 대한 형식 정보를 포함하는 PropertySig Blob(ECMA II.23.2.5)을 포함하는 Blob 힙에 대한 인덱스입니다.

각 속성은 MethodDef 테이블에서 하나 또는 두 개의 행으로 표시됩니다. 읽기 전용 속성은 "get_" 접두사로 단일 메서드로 표현되지만 읽기/쓰기 속성은 "get_"이고 다른 하나는 "put_" 접두사로 두 개의 메서드로 표시됩니다. get 메서드의 서명은 매개 변수를 사용하지 않고 속성 형식의 값을 반환합니다. set 메서드의 서명은 속성 형식의 단일 매개 변수를 사용하며 아무것도 반환하지 않습니다.

속성의 MethodDef 행에는 다음이 포함됩니다.

  • RVA: 0
  • ImplFlags: None
  • 플래그: 공용 | 가상 | HideBySig | newSlot | 추상 | specialname(0xDC6)
  • 이름: "get_PropertyName" 또는 "put_<PropertyName>"이 포함된 문자열 테이블의> 인덱스<입니다.
  • 서명: 위에서 설명한 대로 메서드의 매개 변수 형식 및 반환 형식을 포함하는 MethodDefSig Blob(ECMA II.23.2.1)을 포함하는 Blob 힙에 대한 인덱스입니다.
  • ParamList: 이 메서드와 연결된 Param 행의 실행 중 첫 번째 행을 포함하는 Param 테이블(ECMA II.22.33)에 대한 인덱스입니다. Param 테이블의 값은 위의 메서드 아래에 지정된 값입니다.

속성의 각 MethodDef 행에는 다음 정보가 포함된 MethodSemantics 테이블에 연결된 행이 있습니다.

  • 의미 체계: Getter 또는 Setter를 적절하게 사용합니다.
  • 메서드: getter 또는 setter 메서드를 포함하는 MethodDef 테이블에 인덱스합니다.
  • 연결: 속성을 포함하는 속성 테이블에 대한 인덱스입니다.

이벤트

인터페이스의 각 이벤트는 이벤트(ECMA II.22.13), EventMap(ECMA II.22.12), MethodSemantics(ECMA II.22.28) 및 MethodDef(ECMA II.22.26) 테이블의 행으로 정의됩니다.

하나 이상의 이벤트가 있는 각 인터페이스는 다음 정보를 포함하는 EventMap 테이블의 단일 행으로 표시됩니다.

  • 부모: 속성을 포함하는 인터페이스를 포함하는 TypeDef 테이블의 인덱스입니다.
  • EventList: 이 형식과 연결된 행의 첫 번째 행이 포함된 이벤트 테이블의 인덱스입니다.

각 이벤트는 다음 정보를 포함하는 이벤트 테이블의 단일 행으로 표시됩니다.

  • EventFlags: 없음.
  • 이름: 속성 이름을 포함하는 문자열 힙의 인덱스입니다.
  • EventType: 이벤트의 대리자 형식을 포함하는 적절한 테이블에 인덱싱하는 TypeDefOrRef입니다.

각 이벤트는 MethodDef 테이블에서 두 개의 행으로 표시됩니다. 하나는 이벤트 수신기를 추가하기 위한 "add_" 접두사로, 하나는 이벤트 수신기를 제거하기 위한 "remove_" 접두사로 표시됩니다. add 메서드는 대리자 인스턴스를 사용하고 Windows 반환합니다. 이벤트 등록을 나타내는 Foundation.EventRegistrationToken입니다. remove 메서드는 add 메서드에서 반환된 EventRegistrationToken을 사용하여 이벤트를 등록 취소합니다.

이벤트에 대한 MethodDef 행에는 다음이 포함됩니다.

  • RVA: 0
  • ImplFlags: None
  • 플래그: 공용 | 최종 | 가상 | hidebysig | newslot | specialname(0x09e6)
  • 이름: "add_PropertyName" 또는 "remove_<<PropertyName>"을 적절하게 포함하는 문자열 테이블의> 인덱스입니다.
  • 서명: 아래에 설명된 대로 메서드의 매개 변수 및 반환 형식을 포함하는 MethodDefSig Blob(ECMA II.23.2.1)을 포함하는 Blob 힙의 인덱스입니다.
    • Add_ 메서드는 대리자 형식의 단일 매개 변수를 사용하고 Windows 반환합니다. Foundation.EventRegistrationToken.
    • Remove_ 메서드는 단일 Windows 사용합니다. Foundation.EventRegistrationToken 매개 변수와 아무 것도 반환하지 않습니다.
  • ParamList: 메서드와 연결된 Param 행의 실행 중 첫 번째 행을 포함하는 Param 테이블(ECMA II.22.33)에 대한 인덱스입니다. Param 테이블의 값은 위의 메서드 아래에 지정된 값입니다.

이벤트에 대한 두 MethodDef 행은 다음 정보를 포함하는 MethodSemantics 테이블에 연결된 행을 갖습니다.

  • 의미 체계: AddOn 또는 RemoveOn을 적절하게 사용합니다.
  • 메서드: 수신기 추가 또는 제거 메서드를 포함하는 MethodDef 테이블에 인덱싱합니다.
  • 연결: 이벤트를 포함하는 이벤트 테이블에 대한 인덱스입니다.

런타임 클래스

런타임 클래스는 다음과 같이 열이 설정된 TypeDef 테이블(ECMA II.22.37)에서 행으로 구현됩니다.

  • 플래그: 모든 런타임 클래스는 공용, 자동 레이아웃, 클래스 및 tdWindowsRuntime 플래그를 전달해야 합니다.
    • 정적 전용 클래스는 추상 플래그를 전달합니다. 다른 모든 클래스는 추상 플래그를 전달하지 않습니다.
    • 구성 불가능 클래스는 봉인된 플래그를 전달합니다. 작성 가능한 클래스는 봉인된 플래그를 전달하지 않습니다.
  • 이름: 클래스 이름을 포함하는 문자열 테이블의 인덱스입니다.
  • 네임스페이스 - 형식의 네임스페이스를 포함하는 문자열 힙의 인덱스입니다.
  • 확장: 구성 가능한 클래스 또는 mscorlib의 System.Object를 참조하는 TypeRef에 대한 인덱스입니다.
  • FieldList: 비어 있어야 합니다.
  • MethodList: 이 형식이 소유한 메서드의 연속 실행 중 첫 번째를 표시하는 MethodDef 테이블의 인덱스입니다. MethodDef 테이블의 내용에 대한 세부 정보는 아래에 자세히 설명되어 있습니다.

시스템에서 제공하는 모든 클래스의 경우 VersionAttribute를 클래스의 TypeDef 행에 추가해야 합니다.

구현된 인터페이스

런타임 클래스에서 구현되는 인터페이스는 다음과 같이 열이 설정된 InterfaceImpl 테이블(ECMA II.22.23)의 행으로 표시됩니다.

  • 클래스: 형식을 포함하는 행의 TypeDef 테이블에 대한 인덱스입니다.
  • 인터페이스: 구현된 인터페이스를 지정하는 TypeDef, TypeRef 또는 TypeSpec 테이블에 대한 인덱스입니다. 시스템에서 제공하는 메타데이터 파일에서는 필요한 인터페이스가 동일한 메타데이터 파일에 정의되어 있더라도 TypeDef가 되지 않습니다. 자세한 내용은 TypeDef 리디렉션 섹션을 참조하세요.

런타임 클래스는 InterfaceImpl 행 중 하나만에 DefaultAttribute를 지정해야 합니다.

런타임 클래스는 InterfaceImpl 행에서 OverridableAttribute 또는 ProtectedAttribute를 지정할 수 있습니다. 동일한 행에 OverridableAttribute 및 ProtectedAttribute를 둘 다 지정하지 않을 수 있습니다.

필요에 따라 VersionAttribute를 클래스의 interfaceImpl 행에 추가할 수 있습니다. 클래스의 interfaceImpl 행에 있는 VersionAttribute의 버전 값은 클래스의 TypeDef 행에 있는 VersionAttribute의 값보다 크거나 같아야 합니다.

정적 인터페이스

런타임 클래스에는 StaticAttribute 사용자 지정 특성이 0개 이상 있습니다. 각각 지정된 매개 변수가 서로 다르면 둘 이상의 StaticAttribute 사용자 지정 특성을 지정하는 것이 좋습니다. 모든 StaticAttribute는 다음 정보가 포함된 CustomAttribute 테이블의 행으로 표시됩니다.

  • 부모: StaticAttribute가 연결된 런타임 클래스입니다.
  • 형식: StaticAttribute의 .ctor에 대한 참조입니다.
  • 값: System.Type 정적 인터페이스 매개 변수 및 Uint32 버전 매개 변수를 포함하는 사용자 지정 특성 Blob입니다.

정품 인증

런타임 클래스에는 ActivatableAttribute 사용자 지정 특성이 0개 이상 있습니다. 각각 지정된 매개 변수가 서로 다르면 두 개 이상의 ActivatableAttribute 사용자 지정 특성을 지정하는 것이 좋습니다. 모든 ActivatableAttributes는 다음 정보가 포함된 CustomAttribute 테이블에 행으로 표시됩니다.

  • 부모: ActivatableAttribute가 연결된 런타임 클래스입니다.
  • 형식: ActivatableAttribute의 두 .ctor 중 하나에 대한 참조입니다.
    • 직접 활성화: Uint32 버전 매개 변수만 가져오는 .ctor입니다.
    • 팩터리 활성화: System.Type 팩터리 인터페이스 매개 변수 및 Uint32 버전 매개 변수를 가져오는 .ctor입니다.
  • 값: System.Type 팩터리 인터페이스 매개 변수(제공된 경우) 및 Uint32 버전 매개 변수를 포함하는 사용자 지정 특성 Blob입니다.

구성

런타임 클래스에는 ComposableAttribute 사용자 지정 특성이 0개 이상 있습니다. 각각 지정된 매개 변수가 서로 다르면 두 개 이상의 ComposableAttribute 사용자 지정 특성을 지정하는 것이 좋습니다. 모든 ComposableAttribute는 다음 정보가 포함된 CustomAttribute 테이블의 행으로 표시됩니다.

  • 부모: ComposableAttribute가 연결된 런타임 클래스입니다.
  • 형식: ComposableAttribute의 .ctor에 대한 참조입니다.
  • 값: System.Type 컴퍼지션 팩터리 인터페이스 인터페이스 매개 변수, CompositionType 열거형 값(Public 또는 Protected) 및 Uint32 버전 매개 변수를 포함하는 사용자 지정 특성 Blob입니다.

클래스 메서드

런타임 클래스에는 클래스와 연결된 모든 인터페이스의 모든 메서드에 대한 MethodDef 테이블의 행이 있습니다. 여기에는 멤버 인터페이스(일반, 보호 및 재정의 가능), 정적 인터페이스, 정적 팩터리 인터페이스 및 구성 가능한 팩터리 인터페이스가 포함됩니다. 또한 직접 활성화를 지원하는 클래스에는 이를 나타내는 행이 MethodDef 테이블에 있습니다.

멤버 인터페이스 멤버

멤버 인터페이스의 각 메서드(보호된 인터페이스 및 재정의 가능한 인터페이스 포함)는 클래스의 MethodDef 테이블의 행으로 표시됩니다. 클래스의 methodDef 테이블에는 Param 테이블 행 및 사용자 지정 특성을 포함하여 원래 선언 인터페이스의 MethodDef 정보의 정확한 복사본이 포함되어 있으며, 다음 예외가 있습니다.

  • 런타임 클래스는 멤버 인터페이스에 정의된 메서드의 대체 이름을 지정할 수 있습니다.
  • 런타임 클래스의 메서드는 추상 플래그를 얻지 않습니다.
  • 런타임 클래스의 메서드는 런타임 MethodImpl 플래그를 가져옵니다.
  • 재정의할 수 없는 인터페이스의 메서드는 추가로 최종 플래그를 가져옵니다. 재정의 가능한 인터페이스의 메서드는 최종 플래그를 얻지 않습니다.

멤버 인터페이스에서 클래스의 MethodDef 테이블의 각 행은 다음과 같이 값이 있는 MethodImpl 테이블(ECMA II.22.27)의 항목을 통해 메서드를 원래 정의한 인터페이스 메서드에 다시 연결됩니다.

  • 클래스 - 메서드를 전달하는 클래스를 참조하는 TypeDef 테이블의 인덱스입니다(참고: 이 인덱스는 TypeDef 리디렉션의 적용을 받지 않음).
  • MethodBody – 클래스 메서드를 참조하는 MethodDef 테이블의 인덱스입니다.
  • MethodDeclaration – 원래 선언된 인터페이스 메서드를 참조하는 MethodDef 또는 MemberRef 테이블의 인덱스입니다.
정적 인터페이스 멤버

정적 인터페이스의 각 메서드는 클래스의 MethodDef 테이블의 행으로 표시됩니다. 클래스의 methodDef 테이블에는 Param 테이블 행 및 사용자 지정 특성을 포함하여 원래 선언 인터페이스의 MethodDef 정보의 정확한 복사본이 포함되어 있으며, 다음 예외가 있습니다.

  • 정적 멤버는 가상, 추상, NewSlot 및 인스턴스 플래그를 얻지 않습니다.
  • 정적 멤버는 정적 및 클래스 플래그를 가져옵니다.
  • 런타임 클래스의 정적 메서드는 런타임 MethodImpl 플래그를 가져옵니다.
활성화 멤버

매개 변수가 없는 직접 활성화를 지원하는 클래스에는 다음 열 값이 있는 클래스의 MethodDef 테이블에 생성자 행이 있습니다.

  • RVA: 0x00
  • ImplFlags: 런타임
  • 플래그: 공용 | HideBySig | SpecialName | RTSpecialName | 인스턴스
  • 이름: ".ctor"를 포함하는 문자열 테이블의 인덱스입니다.
  • 서명: 매개 변수를 포함하지 않고 null을 반환하는 MethodDefSig Blob(ECMA II.23.2.1)을 포함하는 Blob 힙에 대한 인덱스입니다.
  • ParamList: 비어 있어야 합니다.

팩터리 활성화를 지원하는 클래스에는 다음 열 값이 있는 구현된 모든 팩터리 인터페이스의 모든 메서드에 대한 클래스의 MethodDef 테이블에 생성자 행이 있습니다.

  • RVA: 0x00
  • ImplFlags: 런타임
  • 플래그: 공용 | HideBySig | SpecialName | RTSpecialName | 인스턴스
  • 이름: ".ctor"를 포함하는 문자열 테이블의 인덱스입니다.
  • 서명: 입력 매개 변수를 포함하고 null을 반환하는 MethodDefSig Blob(ECMA II.23.2.1)을 포함하는 Blob 힙에 대한 인덱스입니다.
  • ParamList: 모든 매개 변수에 대한 행이 있는 Params 테이블에 대한 포인터로, 원래 선언된 팩터리 메서드의 매개 변수 테이블에서 정확히 복사됩니다.
컴퍼지션 멤버

컴퍼지션 팩터리 활성화를 지원하는 클래스에는 다음 열 값이 있는 구현된 모든 팩터리 인터페이스의 모든 메서드에 대해 클래스의 MethodDef 테이블에 생성자 행이 있습니다.

  • RVA: 0x00
  • ImplFlags: 런타임
  • 플래그: 공용 | HideBySig | SpecialName | RTSpecialName | 인스턴스
  • 이름: ".ctor"를 포함하는 문자열 테이블의 인덱스입니다.
  • 서명: 사용자 지정 입력 매개 변수를 포함하고 null을 반환하는 MethodDefSig Blob(ECMA II.23.2.1)을 포함하는 Blob 힙에 대한 인덱스입니다. 제어되는 IInspectable* [in] 매개 변수 및 위임되지 않는 IInspectable** [out] 매개 변수는 메서드 서명에 반영되지 않습니다.
  • ParamList: 제어되는 IInspectable* [in] 매개 변수 및 위임하지 않는 IInspectable** [out] 매개 변수를 제외한 모든 매개 변수에 대한 행이 있는 Params 테이블에 대한 포인터로, 원래 선언된 팩터리 메서드의 매개 변수 테이블에서 정확히 복사됩니다.

사용자 지정 특성

사용자 지정 특성에는 각각 매개 변수 형식이 기본 형식, 열거형 및 System.Type으로 제한되는 매개 변수가 0개 이상 있는 0개 이상의 생성자 메서드가 있습니다. 사용자 지정 특성의 각 생성자는 다음 정보가 포함된 MethodDef의 행으로 나타납니다.

  • RVA(즉, 상대 가상 주소): null
  • ImplFlags: None
  • 플래그: 공용 | HideBySig | specalname | RTSpecialName(0x1886)
  • 이름: ".ctor"라는 이름을 포함하는 문자열 테이블의 인덱스입니다.
  • 서명: 메서드의 매개 변수 형식 및 반환 형식을 포함하는 MethodDefSig Blob(ECMA II.23.2.1)을 포함하는 Blob 힙에 대한 인덱스입니다.
  • ParamList: 이 메서드와 연결된 Param 행의 실행 중 첫 번째 행을 포함하는 Param 테이블(ECMA II.22.33)에 대한 인덱스입니다.

메타데이터 구문의 사용자 지정 특성은 다음과 같이 열이 설정된 CustomAttribute 테이블(ECMA II.22.10)에 행으로 저장됩니다.

  • 부모: 사용자 지정 특성이 연결된 메타데이터 테이블에 인덱싱합니다.
  • 형식: 특성 형식의 생성자에 대한 참조가 포함된 MethodDef 또는 MemberRef 테이블에 대한 인덱스입니다.
  • 값: 위치 및 명명된 특성 매개 변수(ECMA II.23.2)가 포함된 Blob 힙에 인덱싱합니다. WinRT 사용자 지정 특성은 속성을 가질 수 없으므로 사용자 지정 특성 Blob에는 명명된 속성 스타일 인수가 포함되지 않습니다.