WinRT(Windows 런타임) 형식 시스템

일반 사항

기본 형식을 제외한 모든 형식은 네임스페이스 내에 포함되어야 합니다. 형식이 전역 네임스페이스에 있는 것은 유효하지 않습니다.

Windows 제공하는 형식은 모두 Windows.* 네임스페이스에 포함됩니다. Windows 제공되지 않는 WinRT 형식(Microsoft의 다른 부분에서 제공하는 WinRT 형식 포함)은 Windows.*이 아닌 네임스페이스에 있어야 합니다.

인터페이스를 제외하고 모든 WinRT 형식에는 공용 표시 유형이 있어야 합니다. WinRT 인터페이스는 필요에 따라 프라이빗 가시성을 가질 수 있습니다. 다른 모든 사용자 정의 WinRT 형식(구조체, 클래스, 열거형, 대리자, 특성)에는 공용 표시 유형이 있어야 합니다.

WinRT는 중첩 형식을 지원하지 않습니다. WinRT 형식은 다른 형식을 묶을 수 없습니다. WinRT 형식을 다른 형식 내에 중첩할 수 없습니다.

타사 개발자로서 WinRT 형식 시스템의 모든 측면을 사용할 수 있는 것은 아닙니다.

  • WinRT는 인터페이스 및 대리자의 매개 변수화를 지원합니다. 그러나 이 릴리스에서 WinRT는 타사에서 매개 변수가 있는 형식의 정의를 지원하지 않습니다. Windows.* 네임스페이스의 시스템에 포함된 매개 변수가 있는 형식만 지원됩니다.

  • WinRT는 클래스 컴퍼지션을 런타임 상속 메커니즘으로 지원합니다. 그러나 이 릴리스에서 WinRT는 루트 구성 가능한 클래스의 정의를 지원하지 않습니다. Windows.* 네임스페이스의 시스템에 포함된 루트 구성 가능한 클래스만 지원됩니다.

WinRT 네임스페이스와 형식 이름은 대/소문자를 구분하지 않지만 Windows 파일 시스템 및 Windows 레지스트리와 유사합니다. 즉, 대/소문자만 다른 네임스페이스 또는 형식 이름을 사용할 수 없습니다. 예를 들어 Foo.SomeType과 foo 를 둘 다 사용할 수 없습니다 . AnotherTypeFoo.SomeTypeFoo.someType을 둘 다 사용할 수 없습니다.

WinRT 식별자는 다음 문법을 따라야 합니다. 유니코드 3.0 이하에 정의된 문자만 지원됩니다.

    identifier-or-keyword: 
        identifier-start-character   identifier-continuation-characters* 
    identifier-start-character: 
        letter-character
        underscore (U+005F) 
    identifier-continuation-characters: 
        identifier-continuation-character
        identifier-continuation-characters   identifier-continuation-character 
    identifier-continuation-character: 
        identifier-start-character 
        decimal-digit-character
        connecting-character
        combining-character
        formatting-character 
    letter-character: 
        A Unicode 3.0 character of classes Lu, Ll, Lt, Lm, Lo, or Nl 
    combining-character: 
        A Unicode 3.0 character of classes Mn or Mc 
    decimal-digit-character: 
        A Unicode 3.0 character of the class Nd 
    connecting-character: 
        A Unicode 3.0 character of the class Pc 
    formatting-character: 
        Zero Width Non-Joiner (U+200C)
        Zero Width Joiner (U+200D)

매개 변수화된 형식

WinRT는 인터페이스 및 대리자의 형식 매개 변수화를 지원합니다. 매개 변수가 있는 형식을 사용하면 매개 변수가 있는 다형성을 지원하는 프로그래밍 언어에서 다형적으로 처리될 수 있는 인터페이스 패밀리를 정의할 수 있습니다.

매개 변수가 있는 형식 인스턴스화는 메서드 매개 변수 위치와 같은 형식 컨텍스트에서 형식의 인수 목록을 사용하여 매개 변수가 있는 형식을 지정할 때 발생합니다. 예를 들어 HRESULT foo(X<Y> x)X 가 명명한 매개 변수가 있는 형식을 첫 번째 및 유일한 형식 인수로 Y 형식으로 인스턴스화합니다.

매개 변수가 없는 WinRT 인터페이스 또는 대리자는 동일한 개체의 다른 인터페이스와 구별되는 기본 인터페이스를 고유하게 식별하기 위해 GUID가 할당됩니다. 매개 변수가 있는 인터페이스(예: IVector<T>대리자 EventHandler<T>)에는 매개 변수가 있는 형식을 고유하게 식별하는 GUID인 PIID(매개 변수가 있는 인터페이스 ID)가 대신 할당됩니다. IID가 아닙니다. 이 GUID는 매개 변수가 있는 형식 인스턴스(예 IVector<int>: )에 대한 IID를 생성하는 데 사용됩니다.

매개 변수가 있는 형식 인수 목록

이러한 WinRT 형식은 매개 변수가 있는 형식의 인수 목록에 표시할 수 있습니다.

  • WinRT 기본 형식(예: Boolean, Int32, String, Guid 등)
  • WinRT 열거형
  • WinRT 구조체
  • WinRT 인터페이스
  • WinRT 대리자
  • WinRT 런타임 클래스
  • 다른 매개 변수가 있는 형식 인스턴스화(예 IVector<IVector<int>>: ) 다른 모든 형식은 매개 변수가 있는 형식 인수 목록에 나타나지 않습니다. 예를 들어 배열입니다.

매개 변수가 있는 형식 인스턴스

매개 변수가 없는 형식이 나타날 수 있는 모든 컨텍스트에서 매개 변수가 있는 형식 인스턴스가 나타날 수 있습니다. 매개 변수가 있는 인터페이스 인스턴스는 런타임 클래스에 의해 구현된 인터페이스 목록과 같이 인터페이스를 사용할 수 있는 모든 곳에서 사용할 수 있습니다. 매개 변수가 있는 대리자 인스턴스는 이벤트 정의와 같이 대리자를 사용할 수 있는 모든 위치에서 사용할 수 있습니다.

매개 변수가 있는 형식 매개 변수는 매개 변수가 있는 인터페이스 또는 대리자 정의에 표시할 수 있습니다. 또는 일반 형식이 일반적으로 나타날 수 있는 모든 위치입니다. 인터페이스만 나타날 수 있는 매개 변수가 나타나면 해당 매개 변수는 인터페이스로 제한됩니다. 모든 형식이 나타날 수 있는 컨텍스트에 매개 변수가 나타나면 해당 매개 변수는 제한되지 않습니다. 등등. 매개 변수가 있는 형식 인스턴스에 대한 인수는 이러한 모든 제한을 충족해야 합니다.

매개 변수가 있는 형식에 대한 Guid 생성

GUID 생성 알고리즘은 이러한 요구 사항을 충족해야 합니다.

  • 매개 변수가 있는 형식이 동일한 인수를 사용하여 두 번 인스턴스화되면 두 인스턴스화 모두 동일한 인터페이스 또는 대리자 본문과 동일한 IID를 할당해야 합니다.
  • 매개 변수가 있는 두 형식이 동일한 인수를 사용하여 인스턴스화되는 경우 통계적으로 동일한 IID가 할당될 가능성은 낮아야 합니다.
  • 매개 변수가 있는 형식이 두 번 인스턴스화되지만 인수가 다른 경우 두 인스턴스화에 동일한 IID가 할당될 가능성은 통계적으로 낮아야 합니다.

참고

매개 변수가 있는 형식이 인수와 동일한 인스턴스화로 인스턴스화되거나 인수 목록에 나타나는 다른 매개 변수가 있는 형식(즉, 순환 인스턴스화)에 대한 인수로 인스턴스화할 수 없습니다. 예를 들어 순환Y = Foo<X>이 아닌 경우 위반된 경우X = Foo<Y>입니다. 그러나 if X = Foo<Y>Y = Foo<int>, then non-circularity가 유지되었습니다.

인스턴스화 알고리즘은 다음과 같습니다.

  1. 매개 변수가 있는 각 형식은 작성자가 매개 변수가 있는 인터페이스 ID(약식 PIID)를 할당합니다. PIID는 IID가 아니며 QueryInterface에 인수로 전달되지도 않습니다. 작성자는 PIID가 매개 변수가 있는 형식에 고유한지 확인해야 합니다.
  2. 기본 형식에 대한 형식 시그니처는 ASCII 8진수 문자열입니다(아래 표 참조). 예를 들어 Int32 는 "i4"입니다.
  3. 매개 변수가 있는 인터페이스 인스턴스가 아닌 인터페이스의 형식 서명은 ASCII로 파선 형식으로 인코딩되고 중괄호로 구분된 IID입니다. 예: "{00000000-0000-0000-0000-000000000000}".
  4. 매개 변수가 있는 대리자 인스턴스가 아닌 대리자의 형식 서명은 문자열 "delegate"이고 인터페이스와 마찬가지로 IID입니다. 자세한 문법은 다음에 나타납니다.
  5. 매개 변수가 있는 형식의 GUID는 이 문법에 따라 계산됩니다.
    • UUID rfc 4122에 따르면, signature_octets 5 sha-1 생성 해시를 계산합니다. 이 해시는 rfc 4122/4.3에 설명된 네임스페이스로 단일 winrt pinterface/pintergroup guid를 사용하고 핀터페이스/핀터그룹의 서명과 이를 이름 문자열로 인스턴스화하는 인수를 사용합니다.
    • pinterface 인스턴스화에는 이 GUID와 4의 서명이 할당됩니다.
    signature_octets => guid_to_octets(wrt_pinterface_namespace) string_to_utf8_octets(ptype_instance_signature)

        wrt_pinterface_namespace => "11f47ad5-7b73-42c0-abae-878b1e16adee"

        ptype_instance_signature => pinterface_instance_signature | pdelegate_instance_ signature

        pinterface_instance _signature => "pinterface(" piid_guid  ";" args ")"

        pdelegate_instance _signature => "pinterface(" piid_guid ";" args ")"

        piid_guid => guid

        args => arg | arg ";" args

        arg => type_signature

        type_signature => base_type_identifer | com_interface_signature | interface _signature | delegate_signature  | interface_group_signature | runtime_class_signature | struct_signature | enum_signature | pinterface_instance_signature | pdelegate_instance_signature
        com_interface_signature => "cinterface(IInspectable)"

        base_type_identifier is defined below

        interface_signature => guid

        interface_group_signature => "ig(" interface_group_name ";" default_interface ")"

        runtime_class_signature => "rc(" runtime_class_name ";" default_interface ")"

        default_interface => type_signature

        struct_signature => "struct(" struct_name ";" args ")"

        enum_signature => "enum(" enum_name ";" enum_underlying_type ")"

        enum_underlying_type => type_signature

        delegate_signature => "delegate(" guid ")"

        guid => "{" dashed_hex "}"

        dashed_hex is the format that uuidgen writes in when passed no arguments.

            dashed_hex => hex{8} "-" hex{4} "-" hex{4} "-" hex{4} "-" hex{12}

            hex => [0-9a-f]
  1. p-type 인스턴스화가 anther pinterface에 인수로 전달되면 3단계에서 계산한 서명이 문법 요소 'pinterface_instance_signature' 또는 'pdelegate_instance_signature'의 형식 서명으로 적절하게 사용됩니다.

이러한 이름은 표시할 때 기본 형식에 사용됩니다.

  • UInt8은 "u1"에 매핑됩니다.
  • Int32는 "i4"에 매핑됩니다.
  • UInt32 는 "u4"에 매핑됩니다.
  • Int64는 "i8"에 매핑됩니다.
  • UInt64 는 "u8"에 매핑됩니다.
  • "f4"에 대한 단일
  • " f8"에 이중 매핑
  • 부울 은 "b1"에 매핑됩니다.
    • 부울 형식 매개 변수 지원을 받으려면 wchar_t 기본 제공 형식으로 사용하도록 설정하려면 추가 /Yc:wchar_t 해야 합니다.
  • Char16 은 "c2"에 매핑됩니다.
  • 문자열 은 "string"에 매핑됩니다.
  • Guid 는 "g16"에 매핑됩니다.

위의 이름은 대/소문자를 구분합니다. String을 제외하고 형식 이름은 단일 문자를 사용하여 데이터의 종류를 제안하고 그 다음에는 크기(바이트)를 제안합니다. 이러한 이름은 간결하게 선택되었습니다(구조체 형식 서명에서 큰 크기를 방지하기 위해). WinRT 이름, RIDL 이름 또는 모든 형식에 대한 언어 프로젝션 이름과 비슷하게 표시되지 않도록 합니다. 그리고 여전히 대략 사람이 읽을 수있는 남아있다.

enum_type_signature 유일한 유효한 'underlying_type' 값은 Int32 또는 UInt32 값입니다.

struct_type_signature 경우 인수는 구조체의 필드에 대한 순서대로 type_signatures 목록입니다. 이러한 형식은 기본 형식이거나 다른 구조체 형식일 수 있습니다.

Struct_name 및 enum_name 마침표 "."를 구분 기호로 사용하여 네임스페이스로 한정됩니다. 예를 들어 "네임스페이스 X { 구조체 A{ int; }; }"는 "struct(X.A;i4)"가 됩니다.

Default_interface IDL '[default]' 특성을 사용하여 런타임 클래스 또는 인터페이스 그룹 본문에서 기본값으로 지정된 인터페이스, p 인터페이스 인스턴스, 대리자 또는 p-delegate 인스턴스여야 합니다.

사용자 지정 특성은 무시됩니다. 마샬링에 영향을 주지 않는 것으로 추정됩니다.

버전 관리

기본 형식을 제외한 모든 WinRT 형식에는 Version 특성이 있어야 합니다. 언어 프로젝션은 버전 특성 정보를 사용하여 이전 버전과의 호환성 및 조명 시나리오를 사용하도록 설정합니다. 타사 형식에는 Version 특성이 포함되어야 하지만 언어 프로젝션에서는 무시해야 합니다. 타사 WinRT 구성 요소는 앱에 독점적으로 패키지되므로 앱 자체와 독립적으로 버전을 변경할 수 없습니다.

Version 특성은 필요에 따라 인터페이스 멤버(메서드, 속성 및 이벤트)에 적용될 수 있습니다. 이는 C#/VB 및 C++/CX의 고급 클래스 작성을 위한 것입니다. 인터페이스 멤버의 버전 특성(Windows 시스템 인터페이스 멤버)은 런타임 시 언어 프로젝션에 의해 무시되어야 합니다.

Version 특성에는 부호 없는 32비트 정수 생성자 매개 변수가 포함됩니다. Windows WinRT 형식의 경우 이 값은 연결된 형식 구문이 처음 정의된 Windows 버전에 대한 NTDDI 값입니다. 타사 형식의 경우 이 값의 의미는 형식의 작성자에게 달려 있습니다.

Windows 시스템 구조체, 대리자 및 인터페이스는 정의되면 변경할 수 없습니다. 이후 Windows 릴리스에서는 수정할 수 없습니다.

Windows 시스템 열거형 및 런타임 클래스는 추가적으로 버전 관리가 가능합니다. 열거형은 후속 Windows 릴리스에서 새 열거형 값을 추가할 수 있습니다. 클래스는 후속 Windows 릴리스에서 구현된 새 인터페이스(정적, 활성화 팩터리, 컴퍼지션 팩터리, 재정의 가능 및 보호된 인터페이스 포함)를 추가할 수 있습니다. 추가 버전 관리의 자세한 내용은 열거형 및 런타임 클래스에 대한 섹션에 포함되어 있습니다.

네임스페이스

네임스페이스는 코드를 구성하고 명명 충돌을 방지하는 데 사용되는 명명 범위입니다. WinRT 형식 시스템의 모든 명명된 형식(열거형, 구조체, 대리자, 인터페이스 및 런타임 클래스)은 네임스페이스에 있습니다. 네임스페이스는 다른 네임스페이스를 포함할 수 있습니다.

기본 형식

WinRT 형식 시스템에는 기본 제공 기본 형식의 핵심 집합이 포함되어 있습니다.

WinRT 유형 형식 설명
Int16 부 서명된 16비트 정수
Int32 부 서명된 32비트 정수
Int64 부 서명된 64비트 정수
UInt8 부호 없는 8비트 정수
UInt16 부호 없는 16비트 정수
UInt32 부호 없는 32비트 정수
UInt64 부호 없는 64비트 정수
Single 32비트 IEEE 754 부동 소수점 숫자
Double 64비트 IEEE 754 부동 소수점 숫자
Char16 UTF-16 코드 단위를 나타내는 16비트 숫자가 아닌 값
부울 8비트 부울 값
String 텍스트를 나타내는 데 사용되는 Char16 의 변경할 수 없는 시퀀스입니다.
Guid 128비트 표준 Guid

열거형

열거형 형식은 명명된 상수 집합을 갖는 고유 값 형식입니다.

각 열거형 형식에는 열거형 형식의 기본 형식이라는 해당 정수 형식이 있습니다. WinRT의 유일한 법적 열거형 기본 형식은 Int32UInt32입니다.

기본 형식의 UInt32 가 있는 열거형은 FlagsAttribute를 전달해야 합니다. 기본 형식의 Int32 를 사용하는 열거형은 FlagsAttribute를 전달하지 않아야 합니다.

열거형에는 공용 표시 유형이 있어야 합니다.

열거형 버전 관리

열거형은 가산적으로 버전이 지정 가능합니다. 지정된 열거형의 후속 버전은 값(명명된 상수라고도 함)을 추가할 수 있습니다. 기존 값은 제거되거나 변경되지 않을 수 있습니다. 열거형 값은 필요에 따라 특정 값이 열거형 형식에 추가된 시기를 구분하기 위해 VersionAttribute를 전달합니다. VersionAttribute가 없는 열거형 값은 바깥쪽 열거형 형식과 동일한 버전 값을 갖는 것으로 간주됩니다.

구조체

구조체는 하나 이상의 필드가 있는 레코드 형식입니다. 구조체는 항상 값으로 전달되고 반환됩니다. 구조체 필드는 기본형, 열거형, 구조체, 문자열 및 IReference<T> 일 수 있습니다(후자의 두 필드는 힙 할당 필드 형식이 두 개뿐임).

구조체에는 공용 표시 유형이 있어야 합니다.

일반적으로 구조체에는 하나 이상의 필드가 있어야 합니다(메타데이터 계약 및 특성을 나타내는 형식과 같은 드문 예외가 있습니다). 구조체의 모든 필드는 공용이어야 합니다.

구조체는 제네릭 또는 매개 변수화할 수 없습니다.

인터페이스

인터페이스는 사용이 정의되었지만 구현되지 않은 관련 형식 멤버 그룹으로 구성된 계약입니다. 인터페이스 정의는 인터페이스의 멤버(메서드, 속성 및 이벤트)를 지정합니다. 인터페이스와 연결된 구현이 없습니다.

매개 변수가 없는 인터페이스에는 GuidAttribute를 통해 지정된 고유 인터페이스 ID(IID)가 있어야 합니다. 매개 변수가 있는 인터페이스에는 GuidAttribute를 통해 지정된 고유한 매개 변수가 있는 인터페이스 ID(PIID라고도 함)가 있어야 합니다. PIID는 위에서 지정한 알고리즘을 통해 매개 변수가 있는 특정 인터페이스 인스턴스에 대한 IID를 생성하는 데 사용됩니다.

인터페이스에 퍼블릭 또는 프라이빗 표시 유형이 있을 수 있습니다. 이는 일부 인터페이스가 여러 WinRT 클래스에서 구현된 공유 계약을 나타내고 다른 인터페이스는 단일 WinRT 클래스에서 구현된 멤버를 나타낸다는 사실을 반영합니다. 프라이빗 표시 유형 인터페이스는 ExclusiveToAttribute를 통해 전용인 WinRT 클래스를 지정해야 합니다. 프라이빗 인터페이스는 ExclusiveToAttribute에 지정된 WinRT 클래스에서만 구현할 수 있습니다.

IInspectable 및 IUnknown

인터페이스와 관련하여 WinRT에는 상속에 대한 개념이 없습니다. 대신 인터페이스에 다른 인터페이스가 필요할 수 있다는 생각이 있습니다. 특히 MIDL 3.0 requires 키워드에 대한 자세한 내용은 MIDL 3.0 인터페이스를 참조하세요.

모든 WinRT 인터페이스에는 암시적으로 IInspectable이 필요합니다. 그리고 IInspectable에는 IUnknown이 필요합니다. IUnknown은 기존의 COM 사용에 따라 QueryInterface, AddRef 및 Release라는 세 가지 메서드를 정의합니다. IInspectable은 IUnknown 메서드 외에도 GetIids, GetRuntimeClassName 및 GetTrustLevel의 세 가지 메서드를 정의합니다. 이러한 세 가지 메서드를 사용하면 개체의 클라이언트가 개체에 대한 정보를 검색할 수 있습니다. 특히 IInspectable.GetRuntimeClassName을 사용하면 개체의 클라이언트가 메타데이터에서 확인할 수 있는 WinRT 형식 이름을 검색하여 언어 프로젝션을 사용하도록 설정할 수 있습니다.

인터페이스 필요

위에서 설명한 것처럼 인터페이스는 해당 인터페이스를 구현하는 개체에서 구현해야 하는 하나 이상의 다른 인터페이스가 필요하다고 지정할 수 있습니다. 예를 들어 IButtonIControl이 필요한 경우 IButton 을 구현하는 모든 클래스도 IControl을 구현해야 합니다.

그러나 WinRT 형식 시스템이나 ABI에는 인터페이스 상속 개념이 없습니다. 따라서 기존 인터페이스에서 상속되는 새 인터페이스(예: IFoo2IFoo에서 상속됨)를 구현하여 새 기능을 추가하는 아이디어는 의미가 없습니다. WinRT 언어 프로젝션은 특정 언어에서 사용 편의를 위해 상속 관계를 사용할 수 있으며 런타임 클래스는 상속을 사용할 수 있지만 인터페이스 상속은 MIDL 3.0 작성 컨텍스트에 존재하지 않습니다( MIDL 3.0 인터페이스 참조).

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

인터페이스는 형식 매개 변수화를 지원합니다. 매개 변수가 있는 인터페이스 정의는 인터페이스 멤버 및 필수 인터페이스 목록 외에도 형식 매개 변수 목록을 지정합니다. 매개 변수가 있는 인터페이스의 필수 인터페이스는 단일 형식 인수를 사용하여 필요한 인터페이스와 인터페이스의 매개 변수가 있는 인스턴스(예 IVector<T> requires IIterable<T>: )를 지정하는 것과 같은 형식 인수 목록을 공유할 수 있습니다. 매개 변수가 있는 인터페이스의 멤버(즉, 메서드, 속성 또는 이벤트)의 서명은 매개 변수가 있는 인터페이스의 형식 인수 목록(예: IVector<T>.SetAt([in] UInt32 index, [in] T value))에서 형식을 참조할 수 있습니다.

타사에서는 매개 변수가 있는 새 인터페이스를 정의할 수 없습니다. 시스템에서 정의한 매개 변수가 있는 인터페이스만 지원됩니다.

대리자

대리자는 형식 안전 함수 포인터 역할을 하는 WinRT 형식입니다. 대리자는 기본적으로 IUnknown에서 상속되는 단일 인터페이스를 노출하고 Invoke라는 단일 메서드를 정의하는 간단한 WinRT 개체입니다. 대리자를 차례로 호출하면 참조하는 메서드가 호출됩니다. 대리자는 WinRT 이벤트를 정의하는 데 자주 사용되지만 단독으로 사용되지는 않습니다.

WinRT 대리자는 명명된 형식이며 메서드 서명을 정의합니다. 대리자 메서드 서명은 인터페이스 메서드와 동일한 매개 변수 규칙을 따릅니다. Invoke 메서드의 서명 및 매개 변수 이름은 대리자의 정의와 일치해야 합니다.

인터페이스와 마찬가지로 매개 변수가 없는 대리자는 GuidAttribute를 통해 지정된 고유 인터페이스 ID(즉, IID)가 있어야 합니다. 대리자의 IID는 대리자를 구현하는 데 사용되는 단일 메서드 인터페이스의 IID로 사용됩니다. 매개 변수가 있는 대리자는 GuidAttribute를 통해 지정된 고유한 매개 변수가 있는 인터페이스 ID(PIID라고도 함)가 있어야 합니다. PIID는 위에서 지정한 알고리즘을 통해 매개 변수가 있는 특정 대리자 인스턴스에 대한 IID를 생성하는 데 사용됩니다.

대리자는 공개 표시 유형이 있어야 합니다.

IUnknown

WinRT 인터페이스와 달리 대리자는 IUnknown을 구현하지만 IInspectable은 구현하지 않습니다. 즉, 런타임에 형식 정보를 검사할 수 없습니다.

매개 변수가 있는 대리자

대리자는 형식 매개 변수화를 지원합니다. 매개 변수가 있는 대리자 정의는 위에서 지정한 대로 기존 메서드 서명 외에도 형식 매개 변수 목록을 지정합니다. 메서드 서명에서 모든 매개 변수는 매개 변수가 있는 대리자의 형식 인수 목록의 형식 중 하나로 지정될 수 있습니다.

타사에서는 매개 변수가 있는 새 대리자를 정의할 수 없습니다. 시스템에서 정의한 매개 변수가 있는 대리자만 지원됩니다.

인터페이스 멤버

WinRT 인터페이스는 메서드, 속성 및 이벤트의 세 가지 유형의 멤버를 지원합니다. 인터페이스에 데이터 필드가 없을 수 있습니다.

메서드

WinRT 인터페이스는 0개 이상의 매개 변수를 사용하고 메서드 호출의 성공 또는 실패를 나타내는 HRESULT 를 반환하는 메서드를 지원합니다. 메서드는 필요에 따라 예외 기반 언어의 반환 값으로 프로젝팅할 단일 출력 매개 변수를 나타낼 수 있습니다. 이 반환 값 출력 매개 변수(지정된 경우)는 메서드 서명의 마지막 매개 변수여야 합니다.

메서드에 공용 표시 유형이 있어야 합니다.

메서드는 가변 수의 인수를 사용할 수 없습니다. 메서드에는 선택적 매개 변수나 기본값이 있는 매개 변수가 없을 수 있습니다.

메서드가 매개 변수화되지 않을 수 있습니다. 매개 변수가 있는 대리자와 매개 변수가 있는 인터페이스의 메서드는 메서드 서명에 포함된 형식의 형식 매개 변수를 사용할 수 있습니다.

매개 변수

배열 길이 매개 변수(아래 설명)를 제외한 모든 메서드 매개 변수에는 이름과 형식이 있어야 합니다. 반환 값은 매개 변수와 마찬가지로 이름을 지정해야 합니다. 반환 형식 이름을 포함한 메서드 매개 변수 이름은 메서드 범위 내에서 고유해야 합니다.

매개 변수가 있는 대리자 및 매개 변수가 있는 인터페이스의 멤버에 대한 매개 변수만 매개 변수 형식에 대해 매개 변수가 있는 형식을 지정할 수 있습니다. 메서드는 개별적으로 매개 변수화되지 않을 수 있습니다. 매개 변수는 항상 매개 변수가 있는 형식 인스턴스(예: IVector<int>)를 매개 변수 형식으로 지정할 수 있습니다.

모든 메서드 매개 변수는 매개 변수에서만 또는 외부에 있어야 합니다. In/out 매개 변수는 지원되지 않습니다.

WinRT 인터페이스의 메서드는 HRESULT를 반환해야 하지만 메서드가 예외 기반 언어로 프로젝션될 때 메서드의 최종 out 매개 변수가 반환 값으로 사용되도록 선택적으로 나타낼 수 있습니다. 이러한 매개 변수를 선언하는 데 사용되는 MIDL 구문 후에 [out, retval] 매개 변수라고 합니다. [out, retval] 매개 변수를 지정하면 메서드 서명의 마지막 매개 변수여야 합니다.

매개 변수 목록의 끝에 표시해야 하는 [out, retval] 외에는 out 매개 변수에 대한 다른 순서 지정 요구 사항이 없습니다.

배열 매개 변수

WinRT 메서드는 준수 배열 매개 변수를 지원합니다. 매개 변수를 제외하고 배열을 사용할 수 없습니다. 독립 실행형 명명된 형식일 수 없으며 구조체 필드 형식으로 사용할 수 없습니다. 배열 매개 변수는 , outretval 매개 변수로 in사용할 수 있습니다.

WinRT는 기본 형식(문자열 및 guid 포함), 구조체, 열거형, 대리자, 인터페이스 및 런타임 클래스를 포함하여 대부분의 WinRT 형식의 배열 매개 변수를 지원합니다. 다른 배열의 배열은 허용되지 않습니다.

호환되므로 배열 매개 변수는 항상 배열 크기에 대한 매개 변수로 매개 변수 목록 바로 앞에 있어야 합니다. 배열 크기 매개 변수는 UInt32여야 합니다. 배열 크기 매개 변수에 이름이 없습니다.

WinRT는 세 가지 배열 전달 스타일을 지원합니다.

  • PassArray. 이 스타일은 호출자가 메서드에 배열을 제공하는 경우에 사용됩니다. 이 스타일에서 배열 크기 매개 변수와 배열 매개 변수는 모두 in 매개 변수입니다.
  • FillArray. 이 스타일은 호출자가 최대 배열 크기까지 채울 메서드에 대한 배열을 제공하는 경우에 사용됩니다. 이 스타일에서 배열 크기 매개 변수는 매개 변수이고 in 배열 매개 변수는 매개 변수입니다 out . FillArray 스타일을 사용하는 경우 배열 매개 변수는 필요에 따라 다른 매개 변수 중 하나를 배열 길이 매개 변수로 지정할 수 있습니다. 세부 정보는 아래를 참조하세요.
  • ReceiveArray. 이 스타일은 호출자가 메서드에 의해 할당된 배열을 수신할 때 사용됩니다. 이 스타일에서 배열 크기 매개 변수와 배열 매개 변수는 모두 out 매개 변수입니다. 또한 배열 매개 변수는 참조( ArrayType*가 아닌 ArrayType**)로 전달됩니다.

참고

배열 크기 매개 변수와 in 배열 매개 변수의 out 조합은 WinRT에서 유효하지 않습니다.

배열 매개 변수를 [out, retval] 매개 변수로 사용하는 경우 배열 길이 매개 변수는 매개 변수여야 out 합니다. 즉, ReceiveArray 스타일만 배열에 retval 적합합니다.

배열 길이 매개 변수

FillArray 스타일 배열 매개 변수는 필요에 따라 다른 매개 변수를 배열 길이 매개 변수로 지정할 수 있습니다. 필수 배열 크기 매개 변수가 호출자가 제공하는 배열의 최대 요소 수를 지정하는 경우 배열 길이 매개 변수는 호출자가 실제로 입력한 요소 수를 지정합니다.

배열 길이 매개 변수는 배열 매개 변수의 LengthIs 특성으로 지정됩니다.

메서드 오버로드

단일 인터페이스의 범위 내에서 두 개 이상의 메서드의 이름이 같을 수 있습니다. 인터페이스에서 이름이 같은 메서드에는 고유한 서명이 있어야 합니다. 속성 및 이벤트는 오버로드할 수 없습니다.

WinRT는 매개 변수 형식에 대한 오버로드를 지원하지만 입력 매개 변수 수(메서드의 arity라고도 함)에 대한 오버로드를 선호합니다. 이 작업은 약한 형식의 동적 언어(예: JavaScript)를 지원하기 위해 수행됩니다.

인터페이스에 동일한 이름과 입력 매개 변수 수의 여러 메서드가 있는 경우 정확히 해당 메서드 중 하나가 기본값으로 표시되어야 합니다. 이름과 입력 매개 변수 수가 같은 오버로드된 모든 메서드 중에서 기본값으로 표시된 메서드만 동적이고 약한 형식의 언어로 프로젝션됩니다. 지정된 이름과 입력 매개 변수 수의 오버로드된 메서드가 하나만 있는 경우 기본값으로 표시하는 것은 유효하지만 필수는 아닙니다.

메서드의 건조도를 결정하기 위해 배열 매개 변수와 필요한 길이 매개 변수는 단일 매개 변수로 간주됩니다. PassArray 및 FillArray 스타일은 단일 입력 매개 변수로 간주되지만 ReceiveArray 스타일은 단일 출력 매개 변수로 간주됩니다.

인터페이스의 여러 메서드 이름이 같으면 각 충돌 메서드의 고유한 이름을 메서드에 연결된 OverloadAttribute에 저장해야 합니다. 기본 오버로드된 메서드는 DefaultOverloadAttribute를 전달합니다.

연산자 오버로드

WinRT는 연산자 오버로드를 지원하지 않습니다. 메서드는 ECMA 335 CLI 사양, 파티션 I, 섹션 10.3에 지정된 op_Addition 같은 특수 연산자 이름을 사용하여 이름을 지정할 수 없습니다.

속성

속성은 일부 언어 프로젝션에 메서드가 아닌 필드로 표시되는 이름과 형식이 일치하는 get/set 메서드 쌍입니다.

속성 및 해당 get/set 메서드에는 공용 표시 유형이 있어야 합니다.

속성에는 메서드가 get 있어야 합니다. 속성 getter 메서드에는 매개 변수가 없으며 속성 형식의 값을 반환합니다. 메서드만 있는 get 속성을 읽기 전용 속성이라고 합니다.

속성에는 선택적으로 메서드가 set 있을 수 있습니다. 속성 setter 메서드에는 속성 형식의 단일 매개 변수가 있으며 void를 반환합니다. a와 메서드가 get 둘 다 있는 set 속성을 읽기/쓰기 속성이라고 합니다.

속성은 매개 변수화되지 않을 수 있습니다. 매개 변수가 있는 인터페이스의 속성은 포함하는 형식의 형식 매개 변수를 속성 형식으로 사용할 수 있습니다.

이벤트

이벤트는 이름 및 대리자 형식이 일치하는 추가/제거 수신기 메서드 쌍입니다. 이벤트는 중요한 일이 발생할 때 이해 관계자에게 알리기 위한 인터페이스 메커니즘입니다.

이벤트 및 추가/제거 수신기 메서드는 공용 표시 유형이어야 합니다.

이벤트 add 수신기 메서드에는 이벤트 대리자 형식의 단일 매개 변수가 있으며 Windows 반환합니다. Foundation.EventRegistrationToken. 이벤트 remove 수신기 메서드에는 Windows 단일 매개 변수가 있습니다. Foundation.EventRegistrationToken 형식이며 void를 반환합니다.

이벤트는 매개 변수화되지 않을 수 있습니다. 매개 변수가 있는 인터페이스의 이벤트는 포함하는 형식의 형식 매개 변수를 이벤트 대리자 형식으로 사용할 수 있습니다.

런타임 클래스

WinRT를 사용하면 클래스를 정의할 수 있습니다. 클래스는 하나 이상의 인터페이스를 구현해야 합니다. 클래스는 형식 멤버를 직접 구현할 수 없습니다(즉, 자체 메서드, 속성 또는 이벤트를 정의할 수 없음). 클래스는 구현하는 모든 인터페이스의 모든 멤버 구현을 제공해야 합니다.

아래에 자세히 설명된 여러 유형의 인터페이스가 있습니다.

  • 멤버 인터페이스(보호된 인터페이스 및 재정의 가능한 인터페이스 포함)
  • 정적 인터페이스
  • 정품 인증 팩터리 인터페이스
  • 컴퍼지션 팩터리 인터페이스

런타임 클래스는 매개 변수화할 수 없습니다. 런타임 클래스는 일반적으로 매개 변수가 없는 인터페이스를 수락하는 모든 매개 변수가 지정된 매개 변수가 있는 인터페이스 인스턴스(즉, 모든 형식 매개 변수가 지정된 매개 변수가 있는 인터페이스)를 구현할 수 있습니다.

런타임 클래스에는 공용 표시 유형이 있어야 합니다.

런타임 클래스는 배타적이지 않거나(즉, exclusiveTo 특성을 사용하지 않음) 해당 런타임 클래스에만 배타적인 인터페이스만 구현할 수 있습니다. 런타임 클래스는 다른 런타임 클래스에만 적용되는 인터페이스를 구현할 수 없습니다. 이 규칙에는 한 가지 예외가 있습니다. 구성 가능한 클래스는 재정의 가능한 것으로 표시된 파생 체인의 클래스에만 적용되는 인터페이스를 구현할 수 있습니다. 재정의할 수 있는 인터페이스에 대한 세부 정보입니다.

멤버 인터페이스

런타임 클래스는 0개 이상의 멤버 인터페이스를 구현할 수 있습니다. 멤버 인터페이스를 사용하면 클래스가 클래스 인스턴스와 연결된 기능을 노출할 수 있습니다. 런타임 클래스는 구현하는 멤버 인터페이스의 목록을 지정합니다. 런타임 클래스에 의해 구현된 멤버 인터페이스 목록의 항목은 필요에 따라 버전 정보를 전달할 수 있습니다. 따라야 할 런타임 클래스 버전 관리 세부 정보입니다.

멤버 인터페이스는 런타임 클래스의 인스턴스에서 직접 구현됩니다.

하나 이상의 멤버 인터페이스를 구현하는 런타임 클래스는 멤버 인터페이스 중 하나를 기본 인터페이스로 지정해야 합니다. 멤버 인터페이스 0을 구현하는 런타임 클래스는 기본 인터페이스를 지정하지 않습니다.

정적 인터페이스

WinRT 클래스는 0개 이상의 정적 인터페이스를 지정할 수 있습니다. 정적 인터페이스를 사용하면 클래스가 클래스의 특정 인스턴스가 아닌 클래스 자체와 연결된 기능을 노출할 수 있습니다.

클래스는 하나 이상의 멤버 또는 정적 인터페이스를 지정해야 합니다. 멤버가 없고 정적 인터페이스가 없는 클래스가 잘못되었습니다.

정적 인터페이스는 런타임 클래스와 연결된 StaticAttribute를 통해 지정됩니다. StaticAttribute는 버전 정보뿐만 아니라 정적 인터페이스 참조를 전달합니다. 따라야 할 런타임 클래스 버전 관리 세부 정보입니다.

정적 인터페이스는 런타임 클래스의 일부로 선언되지만 실제로는 클래스 인스턴스 자체에서 구현되지 않습니다. 대신 클래스의 활성화 팩터리에서 구현됩니다. 따라야 할 정품 인증 팩터리에 대한 세부 정보입니다.

활성화

런타임 클래스는 필요에 따라 정품 인증을 지원합니다. 지정된 클래스의 인스턴스를 생성하는 시스템의 기능입니다. 활성화를 지원하려면 클래스가 하나 이상의 멤버 인터페이스를 구현해야 합니다.

WinRT는 직접 활성화(생성자 매개 변수 없음), 팩터리 활성화(하나 이상의 생성자 매개 변수 사용) 및 컴퍼지션 활성화의 세 가지 활성화 메커니즘을 정의합니다. 구성 불가능 클래스는 직접 및/또는 팩터리 활성화를 지원할 수 있습니다. 구성 가능한 클래스는 구성 가능한 활성화만 지원합니다. 컴퍼지션 및 작성 가능한 활성화에 대한 세부 정보입니다.

직접 활성화를 지원하는 클래스는 클래스의 활성화 팩터리에서 IActivationFactory.ActivateInstance 메서드를 호출하여 활성화됩니다. 이 메서드는 매개 변수를 사용하지 않고 런타임 클래스의 새로 활성화된 인스턴스를 반환합니다. 따라야 할 정품 인증 팩터리에 대한 세부 정보입니다.

팩터리 활성화를 지원하는 클래스는 하나 이상의 팩터리 인터페이스를 정의하며, 각 인터페이스는 하나 이상의 팩터리 메서드를 정의합니다. 이러한 팩터리 인터페이스는 클래스의 활성화 팩터리에서 구현됩니다.

팩터리 메서드는 하나 이상의 in 매개 변수를 사용하며 런타임 클래스의 새로 활성화된 인스턴스를 반환해야 합니다. 새로 활성화된 클래스 인스턴스 이외의 다른 out 매개 변수는 허용되지 않습니다. 팩터리 메서드는 하나 이상의 매개 변수를 사용해야 합니다. 매개 변수가 없는 팩터리 활성화는 허용되지 않습니다. 직접 활성화는 매개 변수 없는 활성화에 사용해야 합니다.

직접 또는 팩터리 활성화를 지원하는 클래스는 ActivatableAttribute로 표시됩니다. ActivatableAttribute는 버전 정보(따라야 할 런타임 클래스 버전 관리 세부 정보)와 팩터리 인터페이스에 대한 선택적 참조를 전달합니다. 클래스는 여러 ActivatableAttributes로 표시될 수 있습니다. 즉, 기본 정품 인증을 위한 클래스와 클래스의 활성화 팩터리에서 구현된 모든 팩터리 인터페이스에 대해 하나씩 표시할 수 있습니다. ActivatableAttribute로 표시된 클래스는 ComposableAttribute로 표시되지 않을 수도 있습니다. 따라야 할 컴퍼지션에 대한 세부 정보입니다.

구성

런타임 클래스는 필요에 따라 컴퍼지션을 지원합니다. 여러 클래스 인스턴스를 외부에서 단일 개체로 보이는 항목으로 결합할 수 있습니다. WinRT는 컴퍼지션을 런타임 클래스 상속의 형태로 사용합니다.

WinRT 클래스는 필요에 따라 단일 구성 가능한 기본 클래스를 작성할 수 있으며, 이 클래스는 단일 구성 가능한 기본 클래스 등을 구성할 수 있습니다. 작성 가능한 기본 클래스를 작성하기 위해 클래스 자체를 작성할 필요가 없습니다. 클래스는 작성 가능한 클래스를 기본 클래스로만 작성할 수 있습니다. 구성 가능한 클래스는 다른 구성 가능한 클래스를 작성할 필요가 없습니다(즉, 계층의 루트일 수 있음). 컴퍼지션의 원형 그래프(예: A가 A를 구성하는 A 작성 B)는 허용되지 않습니다.

런타임에 작성 클래스는 컴퍼지션 체인의 각 개체에 대해 하나씩 WinRT 개체의 집계입니다. 이러한 집계된 개체는 컴퍼지션 체인에서 원래 활성화된 개체(제어 개체라고 함)에 ID와 수명을 위임합니다. 체인의 모든 개체는 보호된 인터페이스의 메서드를 포함하여 구성된 기본 클래스 인터페이스에서 메서드를 호출하기 위해 구성하는 클래스에 대한 위임되지 않는 IInspectable 포인터를 보유합니다. 체인의 모든 개체에는 재정의 가능한 인터페이스에서 메서드를 호출하기 위한 수명 및 ID 위임을 위한 제어 클래스에 대한 포인터가 있습니다. 따라야 할 보호되고 재정의 가능한 인터페이스에 대한 세부 정보입니다.

단추Control을 작성하는 예제를 살펴보겠습니다. 그러면 UIElement가 작성됩니다. 이 예제에서 Button 인스턴스는 Control 인스턴스를 집계하며, 이 인스턴스는 UIElement 인스턴스를 집계합니다. 세 개체 모두 수명 및 ID를 제어하고 재정의 가능한 인터페이스에 대한 쿼리를 위해 Button 개체에 대한 참조를 갖습니다. 각 개체에는 구성하는 개체에 대한 IInspectable 포인터가 있습니다(ButtonControl에 대한 포인터를 보유함; 컨트롤UIElement에 대한 포인터를 보유)하여 보호된 인터페이스를 포함하여 구성된 클래스에 구현된 인터페이스에서 메서드를 호출할 수 있도록 합니다.

구성 가능한 클래스에서 인터페이스가 재정의 가능한 것으로 표시되지 않는 한 클래스는 작성하는 클래스에 정의된 인터페이스나 컴퍼지션 체인의 클래스를 구현할 수 없습니다. 재정의할 수 있는 인터페이스에 대한 세부 정보입니다.

작성 가능한 클래스는 하나 이상의 ComposableAttributes로 표시되어야 합니다. ComposableAttribute는 컴퍼지션 팩터리 인터페이스(컴퍼지션 팩터리 인터페이스의 팩터리 메서드를 개체 활성화 제어에 사용할 수 있는지 여부)와 버전 정보에 대한 참조를 전달합니다. 컴퍼지션 팩터리 인터페이스 및 따라야 할 버전 관리의 세부 정보입니다. 클래스는 여러 ComposableAttributes로 표시될 수 있습니다. 클래스의 활성화 팩터리에서 구현하는 모든 컴퍼지션 팩터리 인터페이스에 대해 하나씩 표시됩니다.

JavaScript 언어 프로젝션은 클래스 컴퍼지션을 지원하지 않습니다. 따라서 작성 가능한 클래스 및 작성 가능한 클래스를 JavaScript가 이러한 형식을 프로젝팅하지 않아야 함을 나타내는 WebHostHiddenAttribute로 표시해야 합니다.

타사에서는 다른 구성 가능한 클래스를 구성하는 클래스만 정의할 수 있습니다. 사용자 고유의 구성 가능한 루트 클래스를 정의할 수 없습니다.

구성 가능한 활성화

구성 가능한 클래스는 하나 이상의 컴퍼지션 팩터리 인터페이스를 정의해야 하며, 이 인터페이스는 하나 이상의 컴퍼지션 팩터리 메서드를 구현합니다. 컴퍼지션 팩터리 인터페이스는 클래스의 활성화 팩터리에서 구현됩니다. 따라야 할 정품 인증 팩터리에 대한 세부 정보입니다.

컴퍼지션 팩터리 인터페이스는 클래스의 구성 가능한 인스턴스를 만드는 데 사용됩니다. 구성 가능한 팩터리 인터페이스는 컴퍼지션을 위해 클래스의 인스턴스를 활성화하는 데 사용할 수 있는 0개 이상의 구성 가능한 팩터리 메서드를 선언합니다. 팩터리 메서드가 0인 구성 가능한 팩터리 인터페이스를 사용하는 것이 좋습니다. 이는 클래스를 컴퍼지션에 사용할 수 있지만 타사에서 직접 클래스를 작성하지 않을 수 있음을 의미합니다. 인스턴스를 만드는 메서드는 내부 전용입니다.

작성 가능한 클래스는 지정된 컴퍼지션 팩터리 인터페이스의 팩터리 메서드를 사용하여 클래스를 제어 개체로 직접 활성화할 수 있는지 여부를 선언합니다. public으로 표시된 작성 가능한 팩터리 인터페이스를 사용하여 클래스를 제어 개체로 직접 활성화하고 간접적으로 클래스를 작성 개체로 활성화할 수 있습니다. 보호된 것으로 표시된 작성 가능한 팩터리 인터페이스는 클래스를 구성된 개체로 간접적으로 활성화하는 데만 사용할 수 있습니다. 작성 가능한 클래스는 항상 구성된 개체로 활성화할 수 있습니다.

컴퍼지션 팩터리 인터페이스는 구현되는 런타임 클래스여야 합니다 exclusiveto .

정품 인증 팩터리 메서드와 마찬가지로 컴퍼지션 팩터리 메서드는 구성 가능한 클래스의 인스턴스를 반환해야 합니다. 또한 컴퍼지션 팩터리 메서드에는 제어 IInspectable* [in] 매개 변수와 위임하지 않는 IInspectable** [out] 매개 변수의 두 가지 추가 매개 변수가 있습니다. 컴퍼지션 팩터리 메서드에는 선택적으로 추가 in 매개 변수가 있을 수 있습니다. 지정한 경우 이전에 나열된 위임된 매개 변수 앞에 메서드 시그니처의 시작 부분에서 추가 매개 변수가 발생해야 합니다. 컴퍼지션 팩터리 메서드에는 위임되지 않는 IInspectable** 및 반환 값 매개 변수 이외의 추가 out 매개 변수가 없을 수 있습니다.

컴퍼지션에 대해 구성 가능한 클래스가 활성화되면(예: Button 인스턴스가 활성화될 때 Control 또는 UIElement) ID 및 수명을 제어하는 개체에 대한 포인터가 제어 IInspectable* [in] 매개 변수를 통해 전달됩니다. 구성 가능한 팩터리 메서드는 새로 활성화된 인스턴스를 반환 값으로 반환합니다. 이 인스턴스는 제공된 제어 IInspectable* 에 모든 ID 및 수명 관리 기능을 위임합니다. 또한 작성 가능한 팩터리 메서드는 작성 클래스가 작성 클래스에서 메서드를 호출하는 데 사용할 수 있는 위임되지 않는 IInspectable* 에 대한 포인터를 반환합니다.

구성 가능한 클래스가 제어 클래스로 활성화되는 경우(예: 이전 예제의 Button ) 컴퍼지션 활성화에 동일한 구성 가능한 팩터리 메서드가 사용됩니다. 구성 가능한 클래스를 직접 활성화하면 제어 *IInspectable* 매개 변수에 대해 null이 전달됩니다. 이는 제어 클래스로 활성화되는 구성 가능한 클래스에 대한 표시기입니다. 제어 클래스가 작성하는 클래스의 인스턴스를 만들 때 제어 IInspectable* 매개 변수로 자체에 대한 참조를 전달합니다. 구성 가능한 팩터리 메서드는 제어 클래스 인스턴스를 반환 값으로 반환합니다. 제어 구성 가능한 클래스를 활성화할 때 위임 되지 않는 IInspectable** [out] 매개 변수는 클라이언트 코드에서 무시됩니다.

이전 Button -Control ->>UIElement 예제를 기반으로 하여 단추 클래스는 컴퍼지션 팩터리 메서드 중 하나를 호출하고 외부 매개 변수에 대해 null을 전달하여 활성화됩니다. 단추컨트롤 인스턴스를 활성화하고 외부 매개 변수로 자체에 대한 참조를 전달합니다. 그러면 컨트롤UIElement 인스턴스를 활성화하여 수신한 외부 참조를 외부 매개 변수로 전달합니다. UIElement 팩터리 메서드는 인스턴스 매개 변수에서 새로 만든 UIElement제어뿐만 아니라 내부 매개 변수에서 UIElement의 위임이 아닌 IInspectable에 대한 참조로 돌아갑니다. Control 팩터리 메서드는 인스턴스 매개 변수에서 새로 만든 Control단추와 내부 매개 변수에서 Control의 위임하지 않는 IInspectable에 대한 참조로 돌아갑니다. Button 컴퍼지션 팩터리는 인스턴스 매개 변수에서 새로 만든 Button 호출 코드로 돌아가고 내부 매개 변수의 경우 null입니다.

때로는 컴퍼지션에 대해 클래스를 활성화하고 다른 시간에는 제어 클래스로 활성화할 수 있습니다. 예를 들어 RadioButton단추를 구성하는 경우 RadioButton이 활성화될 때 컴퍼지션에 대해 단추가 활성화됩니다. 단추가 직접 활성화되었을 때 제어 클래스로 활성화됩니다. 두 경우 모두 Button이 작성하는 Control 클래스는 컴퍼지션에 대해 활성화됩니다.

보호된 인터페이스

구성 가능한 클래스는 보호할 멤버 인터페이스를 0개 이상 선언할 수 있습니다. 작성할 수 없는 클래스는 보호될 멤버 인터페이스를 선언하지 않을 수 있습니다. 직접 또는 간접적으로 작성 가능한 클래스를 구성하는 클래스의 코드만 구성 가능한 클래스가 보호된 것으로 선언하는 인터페이스를 쿼리하고 사용할 수 있습니다. 컴퍼지션 체인 외부의 코드는 작성 가능한 클래스가 보호된 것으로 선언하는 인터페이스를 쿼리하거나 사용하지 않을 수 있습니다.

예를 들어 UIElement가 보호된 인터페이스 IUIElementProtected를 선언하는 경우 직접(컨트롤) 및 간접(단추) 컴퍼지션을 포함하여 UIElement를 구성하는 클래스만 IUIElementProtected 인터페이스를 쿼리하고 사용할 수 있습니다.

재정의 가능한 인터페이스

구성 가능한 클래스는 재정의할 수 있도록 0개 이상의 멤버 인터페이스를 선언할 수 있습니다. 재정의 가능한 인터페이스는 앞에서 자세히 설명한 보호된 인터페이스에 액세스하는 규칙과 유사하게 컴퍼지션 체인에 대해서만 쿼리되고 컴퍼지션 체인 내에서 사용될 수 있습니다. 그러나 보호된 인터페이스를 원래 선언한 클래스에서만 구현할 수 있는 경우 재정의 가능한 인터페이스를 구현한 클래스를 구성하는 클래스에서 재정의 가능한 인터페이스를 다시 구현할 수 있습니다.

런타임에 재정의 가능한 인터페이스를 활용하는 구성 가능한 모든 클래스 코드는 ID 및 수명 위임에 사용되는 제어 IInspectable* 포인터를 통해 인터페이스에 대해 QueryInterface를 사용해야 합니다. 이 포인터는 컴퍼지션 체인에서 가장 초기에 재정의 가능한 인터페이스의 구현을 반환합니다(즉, 제어 클래스 인스턴스에 가장 가깝습니다). 작성하는 클래스의 재정의 가능한 인터페이스에 액세스하려는 클래스는 작성 가능한 클래스가 해당 작성 클래스에 보유하는 위임되지 않은 참조를 통해 액세스할 수 있습니다.

UIElement가 재정의 가능한 인터페이스 IUIElementOverridable을 선언하는 예제를 살펴보겠습니다. 이 경우 직접(컨트롤) 및 간접(단추) 파생을 포함하여 UIElement에서 파생되는 클래스를 구현할 수 있습니다. UIElementOverridable의 기능에 액세스하기 위해 UIElement의 코드가 필요한 경우 UIElement는 제어 IInspectable을 쿼리하여 컴퍼지션 체인에서 가장 빠른 구현을 가져옵니다. ControlButton이 모두 IUIElementOverridable을 구현한 경우 제어 IInspectable을 쿼리할 때 단추 구현이 반환됩니다. Button이 구성된 클래스 기능에 액세스하려는 경우 컴퍼지션 팩터리 메서드에서 반환된 위임되지 않은 IInspectable을 사용하여 해당 인터페이스에 대한 기본 클래스를 쿼리할 수 있습니다.

활성화 팩터리

런타임 클래스에는 선택적으로 활성화 팩터리가 있습니다. 클래스가 활성화 가능하거나, 구성 가능하거나, 정적 인터페이스가 있는 경우 런타임 클래스에는 활성화 팩터리를 가져야 합니다. 클래스에 대한 활성화 팩터리는 RoGetActivationFactory Win32 함수를 통해 런타임에 시스템에서 검색할 수 있습니다.

정품 인증 팩터리는 IActivationFactory 인터페이스를 구현해야 합니다. 그러나 직접 활성화를 지원하는 클래스만 IActivationFactory의 단일 메서드 ActivateInstance 구현을 제공합니다. 직접 활성화를 지원하지 않는 클래스는 IActivationFactory.ActivateInstance에서 E_NOTIMPL을 반환해야 합니다.

활성화 팩터리는 모든 정품 인증 팩터리 인터페이스, 컴퍼지션 팩터리 인터페이스 및 런타임 클래스에 정의된 정적 인터페이스를 구현해야 합니다.

언어 프로젝션이 팩터리의 수명 동안 단일 활성화 팩터리 인스턴스를 유지한다는 보장은 없습니다. 정적 멤버 액세스를 위해 수명이 긴 정보를 저장해야 하는 WinRT 클래스 작성자는 정품 인증 팩터리 외부에 저장해야 합니다.

클래스 기반 프로젝션

WinRT는 주로 내부적으로 인터페이스 기반 프로그래밍 모델이지만 런타임 클래스는 최신 OO(개체 지향) 프로그래밍 언어에 더 잘 맞는 클래스 기반 프로그래밍 모델을 제공합니다. 언어 프로젝션은 개발자가 별도로 처리해야 하는 인터페이스 모음이 아닌 단일 엔터티로 런타임 클래스를 프로젝션해야 합니다.

이 클래스 기반 모델을 달성하기 위해 언어 프로젝션은 클래스의 멤버 인터페이스에서 직접 클래스 멤버로 형식 멤버를 프로젝션해야 합니다. 언어 프로젝션은 클래스의 정적 인터페이스에서 정적 클래스 멤버로 형식 멤버를 프로젝션해야 합니다. 마지막으로 언어 프로젝션은 활성화 메서드(직접 활성화 및 팩터리 및 구성 가능한 팩터리 인터페이스의 인터페이스)를 클래스 생성자로 프로젝션해야 합니다.

이 클래스 기반 프로젝션을 지원하기 위해 런타임 클래스에 대한 메타데이터는 구현하는 모든 인터페이스의 모든 메서드, 속성 및 이벤트에 대한 클래스 멤버를 지정합니다. 모든 클래스 멤버는 원래 정의된 인터페이스 멤버에 명시적으로 다시 연결됩니다. 이렇게 하면 언어 프로젝션이 클래스를 단일 엔터티로 노출하여 개발자를 대신하여 모든 인터페이스 쿼리 및 참조 계산을 처리할 수 있습니다.

기본적으로 구현된 모든 인터페이스 멤버는 클래스 멤버로 프로젝션됩니다. 그러나 런타임 클래스는 시간이 지남에 따라 여러 독립 인터페이스 및 버전을 구현할 수 있으므로(따라야 할 버전 관리 세부 정보) 단일 런타임 클래스에 의해 구현된 다른 인터페이스에 정의된 멤버에 대한 이름 충돌이 있을 수 있습니다.

충돌이 발생하면 기본 클래스 멤버 프로젝션이 불가능합니다. 별도의 버전에서 추가된 인터페이스 간에 충돌이 발생하면 초기 버전의 충돌 멤버가 클래스 멤버로 프로젝션됩니다. 동일한 버전에 추가된 인터페이스 간에 충돌이 발생하면 충돌하는 멤버는 클래스 멤버로 프로젝션되지 않습니다. 메서드 오버로드에 설명된 대로 모든 버전이 서로 다른 특성 이 있는 한 이름이 충돌 하는 메서드가 허용됩니다.

클래스 멤버로 프로젝션되지 않은 인터페이스 멤버를 개발자가 사용할 수 있도록 해야 합니다. 일반적으로 이는 캐스팅 또는 동적 조회 연산자를 통해 수행되므로 개발자는 호출하려는 특정 인터페이스와 메서드를 지정할 수 있습니다.

메서드 이름 충돌을 해결하기 위해 런타임 클래스는 구현하는 멤버 및 정적 인터페이스의 메서드에 대한 대체 이름을 지정할 수 있습니다. 이 대체 이름은 클래스 인스턴스에서 충돌하는 메서드 이름에 대한 명확한 액세스를 제공하기 위해 언어 프로젝션에서 사용됩니다. 런타임 클래스는 대체 메서드 이름을 제공할 수 있지만 메서드 시그니처, 매개 변수 및 메서드 또는 해당 특성에 연결된 모든 특성은 여전히 원래 인터페이스 정의와 정확히 일치해야 합니다.

직접 활성화, 팩터리 메서드 및 컴퍼지션 팩터리 메서드는 클래스 생성자로 프로젝션되므로 모두 이름이 같은 것처럼 런타임 클래스에 프로젝션됩니다. 모든 팩터리 인터페이스의 모든 메서드에는 고유한 서명이 있어야 하고, 형식 기반 오버로드를 통해 arity 기반 오버로드를 선호해야 하며, DefaultOverloadAttribute를 사용하여 동일한 특성의 팩터리 메서드를 명확히 해야 합니다.

클래스 버전 관리

런타임 클래스는 추가적으로 버전 관리가 가능합니다. 지정된 런타임 클래스의 후속 버전은 모든 형식의 추가 인터페이스를 지정할 수 있으며, 아래 개별 인터페이스 형식에 대한 자세한 내용은 다음과 같습니다. 클래스에서 지정한 기존 인터페이스는 이전 버전과의 호환성을 손상하지 않고 제거하거나 변경할 수 없습니다.

멤버 인터페이스 버전 관리

런타임 클래스의 멤버 인터페이스는 추가적으로 버전 관리가 가능합니다. 지정된 런타임 클래스의 후속 버전은 클래스가 이전에 멤버 인터페이스를 구현한 적이 없더라도 추가 멤버 인터페이스를 구현할 수 있습니다. 지정된 구성 가능한 런타임 클래스의 후속 버전은 추가로 보호되고 재정의 가능한 인터페이스를 구현할 수 있습니다.

런타임 클래스에서 구현된 인터페이스는 필요에 따라 특정 인터페이스가 런타임 클래스 형식에 추가된 시기를 구분하기 위해 VersionAttribute를 전달합니다. VersionAttribute가 없는 인터페이스 구현 값은 바깥쪽 런타임 클래스 형식과 버전 값이 동일한 것으로 간주됩니다.

정적 인터페이스 버전 관리

런타임 클래스의 정적 인터페이스는 추가적으로 버전 관리가 가능합니다. 지정된 런타임 클래스의 후속 버전은 클래스가 이전에 정적 인터페이스를 구현한 적이 없더라도 추가 정적 인터페이스를 구현할 수 있습니다.

StaticAttribute에는 버전 번호에 대한 UInt32 매개 변수가 포함되어 있으며, 이 매개 변수는 해당 활성화 지원을 추가한 Windows 버전을 정의합니다.

정품 인증 버전 관리

런타임 클래스에 대한 활성화 지원은 추가적으로 버전 관리가 가능합니다. 지정된 런타임 클래스의 후속 버전은 클래스가 활성화 메커니즘을 구현한 적이 없더라도 추가 활성화 메커니즘을 구현할 수 있습니다. 구성 가능한 클래스는 활성화할 수 없으므로 활성화 지원을 추가하지 못할 수 있습니다.

직접 활성화를 지원하는 클래스는 새 팩터리 정품 인증 인터페이스만 추가할 수 있습니다. 이전에 팩터리 활성화만 지원했던 클래스는 직접 정품 인증 지원과 새 팩터리 정품 인증 인터페이스를 추가할 수 있습니다.

ActivatableAttribute에는 버전 번호에 대한 UInt32 매개 변수가 포함되어 있습니다. ActivatableAttribute의 버전 번호는 해당 활성화 지원을 추가한 Windows 버전을 정의합니다.

컴퍼지션 버전 관리

런타임 클래스에 대한 컴퍼지션 지원은 추가적으로 버전 관리가 가능합니다. 지정된 작성 가능한 런타임 클래스의 후속 버전은 클래스가 생성될 때 작성 가능한 것으로 정의되었으면 추가 컴퍼지션 메커니즘을 구현할 수 있습니다. 작성 가능한 클래스는 활성화 지원을 추가할 수 없습니다.

ComposableAttribute에는 버전 번호에 대한 UInt32 매개 변수가 포함되어 있습니다. ComposableAttribute의 버전 번호는 해당 컴퍼지션 지원을 추가한 Windows 버전을 정의합니다.

사용자 지정 특성

WinRT는 사용자 지정 메타데이터 특성의 정의를 지원합니다. WinRT 형식 시스템의 모든 구문은 사용자 지정 메타데이터 특성을 전달할 수 있습니다. 여기에는 명명된 모든 형식(열거형, 구조체, 대리자, 인터페이스, 클래스 등)과 형식 구문에 포함된 개별 요소(예: 메서드, 매개 변수 등)가 포함됩니다.

사용자 지정 특성은 다른 WinRT 형식과 같이 이름이 지정됩니다. 그러나 활성화할 수 없습니다. 순전히 데이터 구문입니다.

사용자 지정 특성은 위치 매개 변수 또는 명명된 필드의 데이터 스키마를 정의합니다. 사용자 지정 특성은 위치 매개 변수와 명명된 필드를 모두 사용하지 않을 수 있습니다. 하나 또는 다른 필드를 선택해야 합니다. 사용자 지정 특성의 매개 변수 및 필드 형식은 WinRT 기본 형식, 열거형 및 다른 WinRT 형식에 대한 참조로 제한됩니다. 다른 매개 변수 또는 필드 형식은 허용되지 않습니다.

위치 매개 변수를 사용하는 사용자 지정 특성은 하나 이상의 유효한 위치 매개 변수 집합을 정의해야 합니다. 각 집합은 0개 이상의 위치 매개 변수를 지정해야 합니다. 사용자 지정 특성의 인스턴스는 선택한 집합의 각 위치 매개 변수에 대한 데이터뿐만 아니라 단일 위치 매개 변수 집합을 지정해야 합니다.

명명된 필드를 사용하는 사용자 지정 특성은 이름 및 형식이 있는 0개의 필드를 지정합니다. 사용자 지정 특성의 인스턴스는 지정하려는 필드의 이름/값 쌍을 지정해야 합니다. 인스턴스는 이름/값 쌍의 모든 값, 일부 또는 없음 값을 지정할 수 있습니다.

특성에 위치 매개 변수나 명명된 필드가 없는 것은 유효합니다.

사용자 지정 특성에는 공용 표시 유형이 있어야 합니다.

특성은 AttributeUsageAttribute를 통해 연결할 수 있는 WinRT 형식 구문의 형식을 지정할 수 있습니다.

타사에서는 사용자 지정 특성을 정의할 수 없습니다. 시스템에서 정의한 사용자 지정 특성만 지원됩니다.