Windows ランタイム (WinRT) 型システム

一般的な注意事項

基本型を除くすべての型は、名前空間内に含める必要があります。 型がグローバル名前空間に存在することは無効です。

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 識別子は、次の文法に準拠している必要があります。 Unicode 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 では、インターフェイスとデリゲートの型パラメーター化がサポートされています。 パラメーター化された型を使用すると、パラメーターポリモーフィズムをサポートするプログラミング言語で多形的に処理される可能性のあるインターフェイスのファミリを定義できます。

パラメーター化された型のインスタンス化は、パラメーター化された型が、メソッド パラメーターの位置など、型コンテキスト内の型の引数リストで指定された場合に発生します。 たとえば、X によって名前付けされたパラメーター化された型をインスタンス化し、HRESULT foo(X<Y> x)Y を最初の唯一の型引数として使用します。

パラメーター化されていない WinRT インターフェイスまたはデリゲートには、基になるインターフェイスを同じオブジェクト上の他のインターフェイスとは異なるものとして一意に識別するための GUID が割り当てられます。 パラメーター化されたインターフェイス (例: IVector<T>) またはデリゲート (例: ) には、 EventHandler<T>パラメーター化されたインターフェイス ID (PIID) が割り当てられます。これは、このパラメーター化された型を一意に識別する GUID です。 これは IID ではありません。 この GUID は、パラメーター化された型インスタンス (たとえば IVector<int>) の ID の生成に使用されます。

パラメーター化された型引数リスト

これらの WinRT 型は、パラメーター化された型の引数リストに表示できます。

  • WinRT の基本型 ( ブール型Int32 型、 文字列型、 Guid 型など)
  • WinRT 列挙型
  • WinRT 構造体
  • WinRT インターフェイス
  • WinRT デリゲート
  • WinRT ランタイム クラス
  • その他のパラメーター化された型のインスタンス化 (例: ) 他の型は、 IVector<IVector<int>>パラメーター化された型引数リストに表示されません。 たとえば、配列です。

パラメーター化された型インスタンス

パラメーター化された型インスタンスは、パラメーター化されていない型を表示できる任意のコンテキストで表示できます。 パラメーター化されたインターフェイス インスタンスは、ランタイム クラスによって実装されるインターフェイスの一覧など、インターフェイスを使用できる任意の場所で使用できます。 パラメーター化されたデリゲート インスタンスは、イベントの定義など、デリゲートを使用できる任意の場所で使用できます。

パラメーター化された型パラメーターは、パラメーター化されたインターフェイスまたはデリゲート定義に表示されます。または、通常の型が通常表示できる任意の場所。 インターフェイスのみを表示できるパラメーターが表示される場合、そのパラメーターはインターフェイスに制限されます。 任意の型が表示できるコンテキストにパラメーターが表示される場合、そのパラメーターは制限されません。などです。 パラメーター化された型インスタンスの引数は、このようなすべての制限を満たす必要があります。

パラメーター化された型の Guid の生成

guid 生成アルゴリズムは、これらの要件を満たす必要があります。

  • パラメーター化された型が同じ引数を使用して 2 回インスタンス化される場合は、両方のインスタンス化に同じインターフェイスまたはデリゲート本体と同じ IID を割り当てる必要があります。
  • 同じ引数を持つ 2 つの異なるパラメーター化された型がインスタンス化される場合、同じ IID が割り当てられる可能性は統計的に低い必要があります。
  • パラメーター化された型が 2 回インスタンス化されるが、引数が異なる場合、2 つのインスタンス化が同じ IID に割り当てられる可能性は統計的に低い必要があります。

注意

引数と同じインスタンス化を使用して、または引数リストに表示される他のパラメーター化された型 (つまり、循環インスタンス化) の引数として、パラメーター化された型をインスタンス化することはできません。 たとえば、非循環性に違反した場合 X = Foo<Y>など Y = Foo<X>です。 ただし、非循環性が維持されている場合 X = Foo<Y>Y = Foo<int>、非循環性が維持されます。

インスタンス化アルゴリズムは次のとおりです。

  1. 各パラメーター化された型には、作成者によってパラメーター化されたインターフェイス ID (PIID の省略形) が割り当てられます。 PIID は IID ではなく、QueryInterface に引数として渡されないことに注意してください。 作成者は、PIID がパラメーター化された型に一意であることを確認する必要があります。
  2. 基本型の型シグネチャは ASCII オクテット文字列です (次の表を参照)。 たとえば、 Int32 は "i4" です。
  3. パラメーター化されたインターフェイス インスタンスではないインターフェイスの型シグネチャは、IID が ASCII で破線でエンコードされ、中かっこで区切られます。 (例: "{00000000-0000-0000-0000-000000000000}")。
  4. パラメーター化されたデリゲート インスタンスではないデリゲートの型シグネチャは、文字列 "delegate" であり、インターフェイスと同様に IID です。 詳細な文法が次に表示されます。
  5. パラメーター化された型の guid は、この文法に従って計算されます。
    • UUID rfc 4122 に従って、signature_octetsの ver 5 sha-1 生成ハッシュを計算します。これは、rfc 4122/4.3 で説明されている名前空間として単一の winrt pinterface/pintergroup guid を使用し、ピンターフェイス/ピンターグループのシグネチャと、名前文字列としてインスタンス化される引数を使用します。
    • ピンターフェイスのインスタンス化には、この 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 型のインスタンス化を引数として 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 を除き、型名は 1 文字を使用してデータの種類を示し、その後にバイト単位でサイズを指定します。 これらの名前は、簡潔にするために(構造体型シグネチャの大きなサイズを避けるために)選択されました。WinRT 名、RIDL 名、または任意の型の言語プロジェクション名と混同しないようにする。そして、まだほぼ人間が読みやすいままです。

enum_type_signatureの場合、有効な 'underlying_type' 値は Int32 または UInt32 のみです。

struct_type_signatureの場合、args は構造体のフィールドのtype_signaturesの順に並べ替えるリストです。 これらは、基本型または他の構造体型である場合があります。

Struct_nameとenum_nameは、ピリオド "." を区切り記号として使用して名前空間で修飾されます。 たとえば、"namespace X { 構造体 A{ int; }; }" は "struct(X.A;i4)" になります。

Default_interfaceは、IDL '[default]' 属性を使用して、ランタイム クラスまたはインターフェイス グループ本文で既定として指定されたインターフェイス、p インターフェイス インスタンス、デリゲート、または p デリゲート インスタンスである必要があります。

カスタム属性は無視されることに注意してください。マーシャリングには影響を与えないことを前提とします。

バージョン管理

基本型を除くすべての 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 ビットの数値以外の値
Boolean 8 ビットのブール値
String テキストを表すために使用される Char16 の不変シーケンス
Guid 128 ビット標準 Guid

列挙型

列挙型は、一連の名前付き定数を使用する固有の値の型です。

各列挙型には、列挙型の基になる型と呼ばれる対応する整数型があります。 WinRT の基になる有効な列挙型は 、Int32UInt32 だけです。

基になる型が UInt32 の列挙型には FlagsAttribute が含まれている必要があります。 基になる型 が Int32 の列挙型には FlagsAttribute を含めてはなりません。

列挙型にはパブリックな可視性が必要です。

列挙型のバージョン管理

列挙型は追加的にバージョン管理可能です。 特定の列挙型の後続のバージョンでは、値 (名前付き定数とも呼ばれます) を追加できます。 既存の値を削除または変更することはできません。 列挙値は、必要に応じて VersionAttribute を実行して、特定の値が列挙型に追加されたタイミングを区別します。 VersionAttribute のない列挙型値は、外側の列挙型と同じバージョン値を持つと見なされます。

構造体

構造体は、1 つ以上のフィールドを持つレコード型です。 構造体は常に渡され、値によって返されます。 構造体フィールドは、プリミティブ、列挙型、構造体、文字列、 および IReference<T> (後者の 2 つはヒープ割り当てフィールドの 2 つの型のみ) にのみできます。

構造体にはパブリックな可視性が必要です。

一般に、構造体には少なくとも 1 つのフィールドが必要です (メタデータ コントラクトや属性を表す型など、まれな例外があります)。 構造体のすべてのフィールドはパブリックである必要があります。

構造体をジェネリックまたはパラメーター化することはできません。

インターフェイス

インターフェイスは、使用法が定義されているが実装が定義されていない関連する型メンバーのグループで構成されるコントラクトです。 インターフェイス定義は、インターフェイスのメンバー (メソッド、プロパティ、イベント) を指定します。 インターフェイスに関連付けられている実装はありません。

パラメーター化されていないインターフェイスには、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 の 3 つのメソッドが定義されています。 IInspectable では、IUnknown メソッドに加えて、GetIids、GetRuntimeClassName、および GetTrustLevel の 3 つのメソッドが定義されています。 これら 3 つのメソッドを使用すると、オブジェクトのクライアントはオブジェクトに関する情報を取得できます。 特に、IInspectable.GetRuntimeClassName を使用すると、オブジェクトのクライアントは、言語プロジェクションを有効にするためにメタデータで解決できる WinRT 型名を取得できます。

インターフェイス に必要な

前述のように、インターフェイスは、対象のインターフェイスを実装する任意のオブジェクトに実装する必要がある 1 つ以上の他のインターフェイスが 必要 であることを指定できます。 たとえば、 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 という名前の 1 つのメソッドを定義する単純な WinRT オブジェクトです。 デリゲートを呼び出すと、参照するメソッドが呼び出されます。 デリゲートは、多くの場合、WinRT イベントの定義に使用されます (ただし、排他的には使用されません)。

WinRT デリゲートは名前付き型で、メソッドシグネチャを定義します。 デリゲート メソッドシグネチャは、インターフェイス メソッドと同じ規則に従います。 Invoke メソッドのシグネチャとパラメーター名は、デリゲートの定義と一致している必要があります。

インターフェイスと同様に、パラメーター化されていないデリゲートには、GuidAttribute を使用して指定された一意のインターフェイス ID (別名 IID) が必要です。 デリゲートの IID は、デリゲートの実装に使用される 1 つのメソッド インターフェイスの IID として使用されます。 パラメーター化されたデリゲートには、GuidAttribute を使用して指定された一意のパラメーター化インターフェイス ID (PIID とも呼ばれます) が必要です。 PIID は、上記で指定したアルゴリズムを使用して、特定のパラメーター化されたデリゲート インスタンスの IID を生成するために使用されます。

代理人は、パブリックな可視性を持っている必要があります。

IUnknown

WinRT インターフェイスとは異なり、デリゲートは IUnknown を実装しますが、 IInspectable は実装しません。 つまり、実行時に型情報を検査することはできません。

パラメーター化されたデリゲート

デリゲートでは、型のパラメーター化がサポートされます。 パラメーター化されたデリゲート定義は、上記で指定した従来のメソッド シグネチャに加えて、型パラメーター リストを指定します。 メソッド シグネチャでは、パラメーター化されたデリゲートの型引数リストの型の 1 つとして任意のパラメーターを指定できます。

サード パーティは、パラメーター化された新しいデリゲートを定義できません。 システムによって定義されたパラメーター化されたデリゲートのみがサポートされます。

インターフェイス メンバー

WinRT インターフェイスでは、メソッド、プロパティ、イベントの 3 種類のメンバーがサポートされています。 インターフェイスにデータ フィールドがない場合があります。

メソッド

WinRT インターフェイスは、0 個以上のパラメーターを受け取り、メソッド呼び出しの成功または失敗を示す HRESULT を返すメソッドをサポートします。 メソッドは、必要に応じて、例外ベースの言語で戻り値として投影される単一の out パラメーターを示すことができます。 この戻り値 out パラメーターを指定する場合は、メソッド シグネチャの最後のパラメーターである必要があります。

メソッドはパブリック可視性を持っている必要があります。

メソッドでは、可変数の引数を使用することはできません。 メソッドには、省略可能なパラメーターや既定値を持つパラメーターを含めないようにすることができます。

メソッドをパラメーター化することはできません。 パラメーター化されたデリゲートとパラメーター化されたインターフェイスのメソッドでは、メソッド シグネチャに含まれる型の型パラメーターを使用できます。

パラメーター

配列の長さパラメーター (後述) を除くすべてのメソッド パラメーターには、名前と型が必要です。 戻り値は、パラメーターと同様に名前を指定する必要があることに注意してください。 戻り値の型名を含むメソッド パラメーター名は、メソッドのスコープ内で一意である必要があります。

パラメーター化されたデリゲートのパラメーターとパラメーター化されたインターフェイスのメンバーのみが、パラメーター型のパラメーター化された型を指定できます。 メソッドを個別にパラメーター化することはできません。 パラメーターでは、パラメーター型として常にパラメーター化された型インスタンス (たとえば IVector<int>) を指定できます。

すべてのメソッド パラメーターは、排他的にインパラメーターまたは out パラメーターである必要があります。 入力/出力パラメーターはサポートされていません。

WinRT インターフェイスのメソッドは HRESULT を返す必要があります。メソッドは、メソッドが例外ベースの言語に投影されるときに、最終的な out パラメーターが戻り値として使用されることを必要に応じて示すことができます。 このようなパラメーターは、宣言に使用される MIDL 構文の後の [out, retval] パラメーターと呼ばれます。 [out, retval] パラメーターを指定する場合は、メソッド シグネチャの最後のパラメーターである必要があります。

パラメーター リストの末尾に表示する必要がある [out, retval] 以外に、out パラメーターの他の順序付け要件はありません。

配列のパラメーター

WinRT メソッドは、適合する配列パラメーターをサポートします。 配列は、パラメーター以外では使用できません。 スタンドアロンの名前付き型にすることはできません。また、構造体フィールド型として使用することはできません。 配列パラメーターは、パラメーターとして、およびretvalパラメーターとしてinout使用できます。

WinRT では、基本的な型 (文字列と guid を含む)、構造体、列挙型、デリゲート、インターフェイス、ランタイム クラスなど、ほとんどの WinRT 型の配列パラメーターがサポートされています。 他の配列の配列は許可されません。

これらは準拠しているため、配列パラメーターは常に、配列サイズのパラメーターによってパラメーター リストの直前に配置する必要があります。 配列サイズ パラメーターは UInt32 である必要があります。 配列サイズ パラメーターに名前がありません。

WinRT では、3 つの異なる配列渡しスタイルがサポートされています。

  • PassArray。 このスタイルは、呼び出し元がメソッドに配列を提供するときに使用されます。 このスタイルでは、配列サイズ パラメーターと配列パラメーターの両方 in がパラメーターです。
  • FillArray。 このスタイルは、呼び出し元が、最大配列サイズまで、塗りつぶすメソッドの配列を提供する場合に使用されます。 このスタイルでは、配列サイズ パラメーターは in パラメーター、配列パラメーターはパラメーターです out 。 FillArray スタイルを使用する場合、配列パラメーターは、必要に応じて、配列長パラメーターとして他のパラメーターのいずれかを指定できます。 詳細は以下を参照してください。
  • ReceiveArray。 このスタイルは、呼び出し元がメソッドによって割り当てられた配列を受け取るときに使用されます。 このスタイルでは、配列サイズ パラメーターと配列パラメーターはどちらも out パラメーターです。 さらに、配列パラメーターは参照によって渡されます (つまり、ArrayType*ではなく ArrayType**)。

注意

配列サイズ パラメーターと out 配列 in パラメーターの組み合わせは、WinRT では無効です。

配列パラメーターを [out, retval] パラメーターとして使用する場合、配列の長さパラメーターはパラメーターである out 必要があります。つまり、配列の場合は ReceiveArray スタイルのみが有効 retval です。

配列の長さパラメーター

FillArray スタイルの配列パラメーターは、必要に応じて、配列の長さパラメーターとして別のパラメーターを指定できます。 必要な配列サイズ パラメーターが呼び出し元によって提供される配列内の要素の最大数を指定する場合、配列の長さパラメーターは、呼び出し先によって実際に入力された要素の数を指定します。

配列の長さパラメーターは、配列パラメーターの LengthIs 属性で指定されます。

メソッドのオーバーロード

1 つのインターフェイスのスコープ内で、複数のメソッドが同じ名前を持つことができます。 インターフェイス上の同じ名前のメソッドには、一意のシグネチャが必要です。 プロパティとイベントをオーバーロードすることはできません。

WinRT ではパラメーター型のオーバーロードがサポートされていますが、入力パラメーターの数 (メソッドの アリティとも呼ばれます) のオーバーロードが優先されます。 これは、動的で弱く型指定された言語 (JavaScript など) をサポートするために行われます。

インターフェイスに同じ名前と数の入力パラメーターの複数のメソッドがある場合は、それらのメソッドの 1 つを既定値としてマークする必要があります。 同じ名前と数の入力パラメーターを持つオーバーロードされたすべてのメソッドのうち、既定値としてマークされたメソッドのみが、動的で弱い型指定された言語によって投影されます。 指定された名前と入力パラメーターの数のオーバーロードされたメソッドが 1 つだけ存在する場合、既定値としてマークすることは有効ですが、必須ではありません。

メソッドのアリティを決定する目的で、配列パラメーターとその必要な長さパラメーターは 1 つのパラメーターを考慮します。 PassArray スタイルと FillArray スタイルは 1 つの入力パラメーターと見なされますが、ReceiveArray スタイルは単一の出力パラメーターと見なされます。

インターフェイス上の複数のメソッドの名前が同じである場合は、各照合メソッドの一意の名前を、メソッドにアタッチされた OverloadAttribute に格納する必要があります。 既定のオーバーロードされたメソッドは、DefaultOverloadAttribute を実行します。

演算子のオーバーロード

WinRT では、演算子のオーバーロードはサポートされていません。 ECMA 335 CLI 仕様、パーティション I、セクション 10.3 で指定されているop_Additionなどの特殊な演算子名を使用して、メソッドの名前を指定することはできません。

プロパティ

プロパティは、名前と型が一致する get/set メソッドのペアであり、一部の言語プロジェクションではメソッドではなくフィールドとして表示されます。

プロパティとその get/set メソッドには、パブリックな可視性が必要です。

プロパティにはメソッドが必要です get 。 プロパティ getter メソッドにはパラメーターがなく、プロパティ型の値を返します。 メソッドのみのプロパティは get 、読み取り専用プロパティと呼ばれます。

プロパティには、必要に応じてメソッドを指定 set できます。 プロパティ セッター メソッドは、プロパティ型の 1 つのパラメーターを持ち、void を返します。 メソッドとメソッドの両方をgetset持つプロパティは、読み取り/書き込みプロパティと呼ばれます。

プロパティをパラメーター化することはできません。 パラメーター化されたインターフェイスのプロパティでは、プロパティ型として、含まれている型の型パラメーターを使用できます。

イベント

イベントは、名前とデリゲート型が一致する add/remove リスナー メソッドのペアです。 イベントは、重要な問題が発生したときに関係者に通知するインターフェイスのメカニズムです。

イベントとその add/remove リスナー メソッドには、パブリックな可視性が必要です。

イベント リスナー メソッドは、イベント add デリゲート型の 1 つのパラメーターを持ち、Windowsを返します。Foundation.EventRegistrationToken. イベント remove リスナー メソッドには、Windowsの 1 つのパラメーターがあります。Foundation.EventRegistrationToken 型、および void を返します。

イベントをパラメーター化することはできません。 パラメーター化されたインターフェイスからのイベントでは、イベント デリゲート型として、含まれている型の型パラメーターを使用できます。

ランタイム クラス

WinRT を使用すると、クラスを定義できます。 クラスは、1 つ以上のインターフェイスを実装する必要があります。 クラスは型メンバーを直接実装できません (つまり、独自のメソッド、プロパティ、イベントを定義することはできません)。 クラスは、実装するすべてのインターフェイスのすべてのメンバーの実装を提供する必要があります。

インターフェイスにはいくつかの種類があり、以下で詳しく説明します。

  • メンバー インターフェイス (保護されたインターフェイスとオーバーライド可能なインターフェイスを含む)
  • 静的インターフェイス
  • アクティブ化ファクトリ インターフェイス
  • コンポジション ファクトリ インターフェイス

ランタイム クラスはパラメーター化できません。 ランタイム クラスは、通常、パラメーター化されていないインターフェイスを受け入れる任意の場所で、パラメーター化されたインターフェイス インスタンス (つまり、すべての型パラメーターが指定されたパラメーター化されたインターフェイス) を実装できます。

ランタイム クラスには、パブリックな可視性が必要です。

ランタイム クラスは、排他的でないインターフェイス (つまり、exclusiveTo 属性を持たない) または該当するランタイム クラスに排他的なインターフェイスのみを実装できます。 ランタイム クラスでは、別のランタイム クラスに排他的なインターフェイスを実装することはできません。 この規則には例外が 1 つあります。構成可能なクラスは、オーバーライド可能としてマークされている派生チェーン内のクラスに排他的なインターフェイスを実装できます。 オーバーライド可能なインターフェイスについて詳しく説明します。

メンバー インターフェイス

ランタイム クラスは、0 個以上のメンバー インターフェイスを実装できます。 メンバー インターフェイスを使用すると、クラスのインスタンスに関連付けられている機能をクラスで公開できます。 ランタイム クラスは、実装するメンバー インターフェイスの一覧を指定します。 ランタイム クラスによって実装されるメンバー インターフェイスの一覧のエントリには、必要に応じてバージョン情報が含まれる場合があります。 ランタイム クラスのバージョン管理について詳しく説明します。

メンバー インターフェイスは、ランタイム クラスのインスタンスに直接実装されます。

1 つ以上のメンバー インターフェイスを実装するランタイム クラスでは、既定のインターフェイスとしていずれかのメンバー インターフェイスを指定する必要があります。 0 個のメンバー インターフェイスを実装するランタイム クラスでは、既定のインターフェイスは指定されません。

静的インターフェイス

WinRT クラスでは、0 個以上の静的インターフェイスを指定できます。 静的インターフェイスを使用すると、クラスの特定のインスタンスではなく、クラス自体に関連付けられている機能をクラスで公開できます。

クラスは、少なくとも 1 つのメンバーまたは静的インターフェイスを指定する必要があります。 メンバーがなく、静的インターフェイスがないクラスが無効です。

静的インターフェイスは、ランタイム クラスに関連付けられている StaticAttribute を使用して指定されます。 StaticAttribute は、静的インターフェイス参照とバージョン情報を参照します。 ランタイム クラスのバージョン管理について詳しく説明します。

静的インターフェイスはランタイム クラスの一部として宣言されますが、実際にはクラス インスタンス自体には実装されません。 代わりに、クラスのアクティブ化ファクトリに実装されます。 後続のアクティブ化ファクトリの詳細。

アクティブ化

ランタイム クラスは、必要に応じてアクティブ化をサポートします。指定したクラスのインスタンスを生成するシステムの機能です。 アクティブ化をサポートするには、クラスで少なくとも 1 つのメンバー インターフェイスを実装する必要があります。

WinRT では、直接アクティブ化 (コンストラクター パラメーターなし)、ファクトリ アクティブ化 (1 つ以上のコンストラクター パラメーターあり)、コンポジション アクティブ化の 3 つのアクティブ化メカニズムが定義されています。 非構成可能なクラスでは、直接アクティブ化とファクトリ アクティブ化のどちらか一方または両方をサポートできます。 構成可能なクラスでは、構成可能なアクティブ化のみがサポートされます。 構成と構成可能なアクティブ化に関する詳細。

直接アクティブ化をサポートするクラスは、クラスのアクティブ化ファクトリで IActivationFactory.ActivateInstance メソッドを呼び出すことによってアクティブ化されます。 このメソッドはパラメーターを受け取らないので、ランタイム クラスの新しくアクティブ化されたインスタンスを返します。 後続のアクティブ化ファクトリの詳細。

ファクトリ アクティブ化をサポートするクラスでは、1 つ以上のファクトリ インターフェイスが定義され、それぞれが 1 つ以上のファクトリ メソッドを定義します。 これらのファクトリ インターフェイスは、クラスのアクティブ化ファクトリに実装されます。

ファクトリ メソッドは 1 つ以上 in のパラメーターを受け取り、ランタイム クラスの新しくアクティブ化されたインスタンスを返す必要があります。 新しくアクティブ化されたクラス インスタンスを超える他 out のパラメーターは許可されません。 ファクトリ メソッドは 1 つ以上のパラメーターを受け取る必要があります。パラメーターなしのファクトリのアクティブ化は許可されません。 パラメーターなしのアクティブ化には、直接アクティブ化を使用する必要があります。

直接アクティブ化またはファクトリ アクティブ化をサポートするクラスは、ActivatableAttribute でマークされます。 ActivatableAttribute には、バージョン情報 (従うランタイム クラスのバージョン管理の詳細) と、ファクトリ インターフェイスへのオプションの参照が含まれています。 クラスは、複数の ActivatableAttributes でマークできます。既定のアクティブ化には最大 1 つ、クラスのアクティブ化ファクトリによって実装されるすべてのファクトリ インターフェイスに対して 1 つ追加されます。 ActivatableAttribute でマークされたクラスも、ComposableAttribute でマークされない場合があります。 後に続くコンポジションの詳細。

コンポジション

必要に応じて、ランタイム クラスはコンポジションをサポートします。複数のクラス インスタンスを外部から 1 つのオブジェクトと見なされるものに結合できます。 WinRT では、コンポジションをランタイム クラス継承の形式として使用します。

WinRT クラスは、必要に応じて 1 つの構成可能な基底クラスを作成できます。このクラスでは、1 つの構成可能な基底クラスを構成できます。クラス自体は、構成可能な基底クラスを作成するために構成可能である必要はありません。 クラスは、基本クラスとして構成可能なクラスでのみ構成できます。 別の構成可能なクラスを作成するために構成可能なクラスは必要ありません (つまり、階層のルートである可能性があります)。 コンポジションの円グラフ (A が A を構成する B を構成するなど) は許可されません。

実行時に、コンポジション クラスは、コンポジション チェーン内のオブジェクトごとに 1 つずつ、WinRT オブジェクトの集計です。 これらの集計オブジェクトは、コンポジション チェーン内の最初にアクティブ化されたオブジェクト (制御オブジェクトと呼ばれます) に ID と有効期間を委任します。 チェーン内のすべてのオブジェクトは、構成された基本クラス インターフェイス (保護されたインターフェイス上のメソッドを含む) でメソッドを呼び出すために、作成するクラスへの非委任 IInspectable ポインターを保持します。 チェーン内のすべてのオブジェクトは、オーバーライド可能なインターフェイスでメソッドを呼び出すために、有効期間と ID を委任するための制御クラスへのポインターを持ちます。 保護されたインターフェイスとオーバーライド可能なインターフェイスについて詳しく説明します。

Buttonコントロールを作成し、UIElement を作成する例を見てみましょう。 この例では、 Button のインスタンスによって コントロール インスタンスが集計され、 UIElement インスタンスが集計されます。 3 つのオブジェクトはすべて、有効期間と ID を制御するため、およびオーバーライド可能なインターフェイスのクエリを実行するための Button オブジェクトへの参照を持ちます。 各オブジェクトには、作成するオブジェクトへの IInspectable ポインターがあります (ButtonControl へのポインターを保持します。 コントロールUIElement へのポインターを保持します)、保護されたインターフェイスを含む、構成されたクラスに実装されているインターフェイスでメソッドを呼び出すことができるようにします。

クラスは、作成可能なクラスでオーバーライド可能としてマークされていない限り、作成するクラスで定義されたインターフェイスやコンポジション チェーン内のクラスを実装することはできません。 オーバーライド可能なインターフェイスについて詳しく説明します。

構成可能なクラスは、1 つ以上の ComposableAttributes でマークする必要があります。 ComposableAttribute は、コンポジション ファクトリ インターフェイスへの参照 (コンポジション ファクトリ インターフェイスのファクトリ メソッドを使用してオブジェクトのアクティブ化を制御できるかどうか) とバージョン情報を提供します。 コンポジション ファクトリ インターフェイスと、従うバージョン管理の詳細。 クラスは、複数の ComposableAttributes でマークできます。1 つは、クラスのアクティブ化ファクトリによって実装されるすべてのコンポジション ファクトリ インターフェイスに対して 1 つです。

JavaScript 言語プロジェクションでは、クラスの構成はサポートされていません。 そのため、作成可能なクラスと、作成可能なクラスを構成するクラスは、JavaScript がこれらの型を投影しようとしないことを示す WebHostHiddenAttribute でマークする必要があります。

サード パーティは、他の構成可能なクラスを構成するクラスのみを定義できます。 独自の構成可能なルート クラスを定義することはできません。

構成可能なアクティブ化

コンポーザブル クラスでは、1 つ以上のコンポジション ファクトリ インターフェイスを定義する必要があります。このインターフェイスは、1 つ以上のコンポジション ファクトリ メソッドを実装します。 コンポジション ファクトリ インターフェイスは、クラスのアクティブ化ファクトリに実装されます。 アクティブ化ファクトリの詳細については、以下を参照してください。

コンポジション ファクトリ インターフェイスは、クラスの構成可能なインスタンスを作成するために使用されます。 コンポーザブル ファクトリ インターフェイスは、合成目的でクラスのインスタンスをアクティブ化するために使用できる、0 個以上のコンポーザブル ファクトリ メソッドを宣言します。 ファクトリ メソッドがゼロのコンポーザブル ファクトリ インターフェイスを持つことは有効であることに注意してください。 これは、クラスをコンポジションに使用できますが、サードパーティがクラスを直接構成することはできません。インスタンスを作成するメソッドは内部のみであることを意味します。

コンポーザブル クラスは、特定のコンポジション ファクトリ インターフェイスのファクトリ メソッドを使用して、クラスを制御オブジェクトとして直接アクティブ化できるかどうかを宣言します。 public としてマークされた構成可能なファクトリ インターフェイスは、クラスを制御オブジェクトとして直接アクティブ化したり、クラスを構成済みオブジェクトとして間接的にアクティブ化したりするために使用できます。 protected とマークされた構成可能なファクトリ インターフェイスは、クラスを構成済みオブジェクトとして間接的にアクティブ化するためにのみ使用できます。 構成可能なクラスは、常に構成済みオブジェクトとしてアクティブ化できます。

コンポジション ファクトリ インターフェイスは、 exclusiveto それが実装するランタイム クラスである必要があります。

アクティブ化ファクトリ メソッドと同様に、コンポジション ファクトリ メソッドは構成可能なクラスのインスタンスを返す必要があります。 さらに、コンポジション ファクトリ メソッドには、制御する IInspectable* [in] パラメーターと、委任されていない IInspectable** [out] パラメーターの 2 つの追加パラメーターがあります。 コンポジション ファクトリ メソッドは、必要に応じて追加 in のパラメーターを持つことができます。 指定した場合、追加の in パラメーターは、前述の必須パラメーターの前に、メソッドシグネチャの先頭で行う必要があります。 コンポジション ファクトリ メソッドには、委任されていない IInspectable** パラメーターと戻り値パラメーターを超える追加outパラメーターがない場合があります。

コンポジション (Button インスタンスがアクティブ化されている場合は ControlUIElement など) に対してコンポーザブル クラスがアクティブ化されると、ID と有効期間を制御するオブジェクトへのポインターが、制御する IInspectable* [in] パラメーターを介して渡されます。 作成可能なファクトリ メソッドは、新しくアクティブ化されたインスタンスを戻り値として返します。 このインスタンスは、提供された制御 IInspectable* にすべての ID および有効期間管理機能を委任します。 さらに、コンポーザブル ファクトリ メソッドは、作成クラスが構成済みクラスのメソッドを呼び出すために使用できる、委任されていない IInspectable* へのポインターを返します。

コンポーザブル クラスが制御クラスとしてアクティブ化される場合 (前の例の Button など)、コンポジションのアクティブ化と同じ構成可能なファクトリ メソッドが使用されます。 コンポーザブル クラスを直接アクティブ化すると、制御する *IInspectable* パラメーターに null が渡されます。 これは、コンポーザブル クラスが制御クラスとしてアクティブ化されていることを示すインジケーターです。 制御クラスが作成するクラスのインスタンスを作成すると、制御する IInspectable* パラメーターとして自身への参照が渡されます。 構成可能なファクトリ メソッドは、制御クラス インスタンスを戻り値として返します。 委任されていない IInspectable** [out] パラメーターは、制御可能な構成可能なクラスをアクティブ化するときに、クライアント コードによって無視されます。

前の Button -Control ->>UIElement の例に基づいて、ボタン クラスは、そのコンポジション ファクトリ メソッドの 1 つを呼び出し、外側のパラメーターに null を渡すことによってアクティブ化されます。 ボタン は次に 、コントロール インスタンスをアクティブ化し、外部パラメーターとしてそれ自体への参照を渡します。 次に、コントロールUIElement インスタンスをアクティブ化し、受け取った外部参照を外部パラメーターとして渡します。 UIElement ファクトリ メソッドは、インスタンス パラメーターで新しく作成された UIElement と、内部パラメーターで UIElement の委任されていない IInspectable への参照を制御するために戻ります。 Control ファクトリ メソッドは、インスタンス パラメーターで新しく作成されたコントロールButton に戻り、内部パラメーターでコントロールの委任されていない IInspectable への参照を返します。 Button コンポジション ファクトリは、インスタンス パラメーターで新しく作成された Button を呼び出し元のコードに戻し、内部パラメーターに null を返します。

あるクラスをコンポジション用にアクティブ化したり、制御クラスとしてアクティブ化したりする場合があります。 たとえば、RadioButton で構成された Button の場合、RadioButton がアクティブ化されたときに、構成に対して Button がアクティブになります。ただし、Button が直接アクティブ化されたときに、制御クラスとしてアクティブ化されます。 どちらの場合も、Button が作成する Control クラスがコンポジション用にアクティブ化されます。

保護されたインターフェイス

構成可能なクラスでは、保護するメンバー インターフェイスを 0 個以上宣言できます。 構成不可能なクラスでは、保護するメンバー インターフェイスを宣言することはできません。 構成可能なクラス (直接的または間接的) を構成するクラス内のコードのみが、構成可能なクラスが保護として宣言するインターフェイスに対してクエリを実行して使用できます。 コンポジション チェーンの外部からのコードは、コンポーザブル クラスが保護対象として宣言するインターフェイスに対してクエリを実行したり、使用したりすることはできません。

たとえば、UIElement で保護されたインターフェイス IUIElementProtected が宣言されている場合、直接 (Control) と間接 (Button) の両方の構成を含む UIElement を構成するクラスのみが、IUIElementProtected インターフェイスを照会して使用できます。

オーバーライド可能なインターフェイス

構成可能なクラスは、そのメンバー インターフェイスの 0 個以上をオーバーライド可能として宣言できます。 オーバーライド可能なインターフェイスは、前に詳しく説明した保護されたインターフェイスへのアクセスに関する規則と同様に、コンポジション チェーンに対してのみクエリを実行し、コンポジション チェーン内で使用できます。 ただし、保護されたインターフェイスが最初に宣言されたクラスによってのみ実装される場合、オーバーライド可能なインターフェイスは、オーバーライド可能なインターフェイスを実装したクラスを構成するクラスによって再実装される可能性があります。

実行時に、オーバーライド可能なインターフェイスを利用する構成可能なクラス コードでは、ID と有効期間の委任に使用される制御 IInspectable* ポインターを介してインターフェイスの QueryInterface が必要です。 このポインターは、コンポジション チェーン内で最も早くオーバーライド可能なインターフェイスの実装を返します (つまり、制御クラス インスタンスに最も近い)。 作成するクラスのオーバーライド可能なインターフェイスにアクセスするクラスは、作成可能なクラスがその構成済みクラスに保持する非委任参照を介して行うことができます。

UIElement がオーバーライド可能なインターフェイス IUIElementOverridable を宣言する例を見てみましょう。 その場合、直接 (Control) 派生と間接 (Button) 派生の両方を含む UIElement から派生したクラスを実装できます。 UIElement のコードが IUIElementOverridable の機能にアクセスする必要がある場合、UIElement は制御する IInspectable にクエリを実行して、コンポジション チェーンの最も早い実装を取得します。 ControlButton の両方が IUIElementOverridable を実装した場合、制御する IInspectable のクエリが実行されたときに Button の実装が返されます。 Button が構成されたクラス機能にアクセスする場合は、コンポジション ファクトリ メソッドから返された委任されていない IInspectable を使用して、そのインターフェイスの基底クラスに対してクエリを実行できます。

アクティベーション ファクトリ

ランタイム クラスには、必要に応じてアクティブ化ファクトリがあります。 クラスがアクティブ化可能、構成可能、または静的インターフェイスを持つ場合は、ランタイム クラスにアクティブ化ファクトリが必要です。 クラスのアクティブ化ファクトリは、 実行時に RoGetActivationFactory Win32 関数を使用してシステムから取得できます。

アクティブ化ファクトリでは、 IActivationFactory インターフェイスを実装する必要があります。 ただし、直接アクティブ化をサポートするクラスのみが 、IActivationFactory の単一メソッド ActivateInstance の実装を提供します。 直接アクティブ化をサポートしていないクラスは、IActivationFactory.ActivateInstance から E_NOTIMPL を返す必要があります。

アクティブ化ファクトリは、ランタイム クラスで定義されているすべてのアクティブ化ファクトリ インターフェイス、コンポジション ファクトリ インターフェイス、および静的インターフェイスを実装する必要があります。

言語プロジェクションで、ファクトリの有効期間中に 1 つのアクティブ化ファクトリ インスタンスが維持される保証はありません。 静的メンバー アクセスのために有効期間の長い情報を保存する必要がある WinRT クラスの作成者は、アクティブ化ファクトリの外部に保存する必要があります。

クラス ベースのプロジェクション

WinRT は主に内部のインターフェイス ベースのプログラミング モデルですが、ランタイム クラスは、最新のメインストリームオブジェクト指向 (OO) プログラミング言語に合わせたクラスベースのプログラミング モデルを提供します。 言語プロジェクションは、開発者が個別に処理する必要があるインターフェイスのバッグとしてではなく、単一のエンティティとしてランタイム クラスを投影することが期待されます。

このクラス ベースのモデルを実現するために、言語プロジェクションは、クラスのメンバー インターフェイスから直接クラス メンバーとして型メンバーを射影することが期待されます。 言語プロジェクションは、クラスの静的インターフェイスの型メンバーを静的クラス メンバーとして射影することが期待されます。 最後に、言語プロジェクションは、アクティブ化メソッド (直接アクティブ化だけでなく、ファクトリ インターフェイスとコンポーザブル ファクトリ インターフェイスからのインターフェイス) をクラス コンストラクターとして射影することが期待されます。

このクラス ベースのプロジェクションを支援するために、ランタイム クラスのメタデータでは、実装するすべてのインターフェイスからのすべてのメソッド、プロパティ、およびイベントのクラス メンバーを指定します。 すべてのクラス メンバーは、最初に定義されたインターフェイス メンバーに明示的に関連付けられます。 これにより、言語プロジェクションでクラスを 1 つのエンティティとして公開し、開発者に代わってすべてのインターフェイスクエリと参照カウントを処理できます。

既定では、実装されているすべてのインターフェイス メンバーはクラス メンバーとして投影されます。 ただし、ランタイム クラスでは、時間の経過と伴う複数の独立したインターフェイスとバージョンを実装できるため (バージョン管理の詳細に従う必要があります)、1 つのランタイム クラスによって実装される異なるインターフェイスで定義されたメンバーの名前の競合が発生する可能性があります。

競合が発生した場合、既定のクラス メンバープロジェクションは不可能です。 別のバージョンで追加されたインターフェイス間で競合が発生した場合、最も古いバージョンの衝突メンバーはクラス メンバーとして投影されます。 同じバージョンで追加されたインターフェイス間で競合が発生した場合、衝突するメンバーはクラス メンバーとして投影されません。 メソッドのオーバーロードで説明されているように、すべてのバージョンが異なる アリティ である限り、名前が衝突する メソッドは許可されます。

クラス メンバーとして投影されないインターフェイス メンバーは、開発者が使用できるようにする必要があります。 通常、これはキャスト演算子または動的ルックアップ演算子によって行われ、開発者は呼び出す特定のインターフェイスとメソッドを指定できます。

メソッド名の競合を解決するために、ランタイム クラスは、実装するメンバーおよび静的インターフェイスのメソッドの代替名を指定できます。 この代替名は、クラス インスタンスから照合するメソッド名への明確なアクセスを提供するために、言語プロジェクションによって使用されます。 ランタイム クラスは別のメソッド名を指定することもできますが、メソッドシグネチャ、パラメーター、およびメソッドまたはその属性にアタッチされている属性は、元のインターフェイス定義と正確に一致する必要があります。

直接アクティブ化、ファクトリ メソッド、およびコンポジション ファクトリ メソッドはクラス コンストラクターとして投影されるため、それらはすべて同じ名前を持つかのようにランタイム クラスに投影されます。 すべてのファクトリ インターフェイスのすべてのメソッドは、一意のシグネチャを持つ必要があり、型ベースのオーバーロードよりも アリティベースのオーバーロードを優先する必要があります。また、DefaultOverloadAttribute を使用して、同じアリティのファクトリ メソッドを明確にする必要があります。

クラスのバージョン管理

ランタイム クラスは、追加的にバージョン管理できます。 特定のランタイム クラスの後続のバージョンでは、すべての型の追加インターフェイスを指定し、以下の個々のインターフェイス型について詳しく説明します。 下位互換性を損なうことなく、クラスで指定された既存のインターフェイスを削除または変更することはできません。

メンバー インターフェイスのバージョン管理

ランタイム クラスのメンバー インターフェイスは、追加的にバージョン管理できます。 特定のランタイム クラスの後続のバージョンでは、クラスが以前にメンバー インターフェイスを実装したことがない場合でも、追加のメンバー インターフェイスを実装できます。 特定の構成可能なランタイム クラスの後続のバージョンでは、追加の保護されたオーバーライド可能なインターフェイスが実装される場合があります。

ランタイム クラスによって実装されるインターフェイスは、必要に応じて VersionAttribute を実行して、ランタイム クラス型に特定のインターフェイスが追加されたタイミングを区別します。 VersionAttribute のないインターフェイス実装値は、外側のランタイム クラス型と同じバージョン値を持つと見なされます。

静的インターフェイスのバージョン管理

ランタイム クラスの静的インターフェイスは、追加的にバージョン管理できます。 特定のランタイム クラスの後続のバージョンでは、クラスが以前に静的インターフェイスを実装したことがない場合でも、追加の静的インターフェイスを実装できます。

StaticAttribute には、バージョン番号の UInt32 パラメーターが含まれています。このパラメーターは、アクティブ化のサポートを追加したWindowsのバージョンを定義します。

アクティブ化のバージョン管理

ランタイム クラスのアクティブ化のサポートは、追加的にバージョン管理できます。 特定のランタイム クラスの後続のバージョンでは、クラスがアクティブ化メカニズムを実装したことがない場合でも、追加のアクティブ化メカニズムを実装できます。 コンポーザブル クラスはアクティブ化できないため、アクティブ化のサポートが追加されない場合があることに注意してください。

直接アクティブ化をサポートするクラスでは、新しいファクトリ アクティブ化インターフェイスのみを追加できます。 以前はファクトリ アクティブ化のみをサポートしていたクラスは、直接アクティブ化のサポートと、新しいファクトリ アクティブ化インターフェイスを追加できます。

ActivatableAttribute には、バージョン番号の UInt32 パラメーターが含まれています。 ActivatableAttribute のバージョン番号は、そのアクティブ化サポートを追加したWindowsのバージョンを定義します。

コンポジションのバージョン管理

ランタイム クラスのコンポジション サポートは、追加的にバージョン管理できます。 特定の構成可能なランタイム クラスの後続のバージョンでは、クラスが作成時に構成可能として定義されていれば、追加のコンポジション メカニズムを実装できます。 構成可能なクラスでは、アクティブ化のサポートが追加されない場合があります。

ComposableAttribute には、バージョン番号の UInt32 パラメーターが含まれています。 ComposableAttribute のバージョン番号は、そのコンポジション サポートを追加したWindowsのバージョンを定義します。

カスタム属性

WinRT では、カスタム メタデータ属性の定義がサポートされています。 WinRT 型システムのすべてのコンストラクトには、カスタム メタデータ属性を含めることができます。 これには、すべての名前付き型 (列挙型、構造体、デリゲート、インターフェイス、クラスなど) と、型コンストラクト内に含まれる個々の要素 (メソッド、パラメーターなど) が含まれます。

カスタム属性の名前は、他の WinRT 型と同様です。 ただし、アクティブ化することはできません。 これらは純粋にデータコンストラクトです。

カスタム属性は、位置指定パラメーターまたは名前付きフィールドのデータ スキーマを定義します。 カスタム属性では、位置指定パラメーターと名前付きフィールドの両方を使用することはできません。いずれか一方を選択する必要があります。 カスタム属性のパラメーターとフィールドの型は、WinRT の基本型、列挙型、および他の WinRT 型への参照に制限されます。 他のパラメーターまたはフィールド型は許可されません。

位置指定パラメーターを使用するカスタム属性では、1 つ以上の有効な位置指定パラメーターセットを定義する必要があります。 各セットでは、0 個以上の位置指定パラメーターを指定する必要があります。 カスタム属性のインスタンスでは、1 つの位置指定パラメーターのセットと、選択したセット内の各位置パラメーターのデータを指定する必要があります。

名前付きフィールドを使用するカスタム属性は、名前と型を持つ 0 個のフィールドを指定します。 カスタム属性のインスタンスでは、指定するフィールドの名前と値のペアを指定する必要があります。 インスタンスでは、名前と値のペアのすべて、一部、またはいずれも値を指定できます。

属性に位置指定パラメーターも名前付きフィールドも含めずに有効です。

カスタム属性には、パブリックな可視性が必要です。

属性は、AttributeUsageAttribute を介して関連付けられる WinRT 型コンストラクトの型を指定できます。

サード パーティはカスタム属性を定義できません。 システムによって定義されたカスタム属性のみがサポートされます。