型システム (C++/CX)Type System (C++/CX)

Windows ランタイムアーキテクチャを使用すると、C++/CX、Visual Basic、Visual C#、および JavaScript を使用して、Windows API に直接アクセスし、他の Windows ランタイムのアプリやコンポーネントと相互運用するアプリやコンポーネントを作成できます。By using the Windows Runtime architecture, you can use C++/CX, Visual Basic, Visual C# and JavaScript to write apps and components that directly access the Windows API and interoperate with other Windows Runtime apps and components. C++ で記述されたアプリユニバーサル Windows プラットフォーム、CPU で直接実行されるネイティブコードにコンパイルされます。Universal Windows Platform apps that are written in C++ compile to native code that executes directly in the CPU. C# または Visual Basic で記述されたアプリは、Microsoft 中間言語 (MSIL) にコンパイルされ、共通言語ランタイム (CLR) で実行ユニバーサル Windows プラットフォームます。Universal Windows Platform apps that are written in C# or Visual Basic compile to Microsoft intermediate language (MSIL) and execute in the common language runtime (CLR). JavaScript で記述されたユニバーサル Windows プラットフォームアプリは、実行時環境で実行されます。Universal Windows Platform apps that are written in JavaScript execute in a run-time environment. Windows ランタイムオペレーティングシステムコンポーネント自体は、C++ で記述され、ネイティブコードとして実行されます。The Windows Runtime operating system components themselves are written in C++ and run as native code. これらのコンポーネントとユニバーサル Windows プラットフォームアプリはすべて、Windows ランタイムアプリケーションバイナリインターフェイス (ABI) を介して直接通信します。All of these components and Universal Windows Platform apps communicate directly through the Windows Runtime application binary interface (ABI).

最新の C++ 表現で Windows ランタイムのサポートを有効にするために、Microsoft は C++/CX を作成しました。To enable support for the Windows Runtime in a modern C++ idiom, Microsoft created the C++/CX. C++/CX には、組み込みの基本型と基本的な Windows ランタイム型の実装が用意されています。これにより、C++ アプリとコンポーネントは、他の言語で記述されたアプリと ABI を介して通信できます。C++/CX provides built-in base types and implementations of fundamental Windows Runtime types that enable C++ apps and components to communicate across the ABI with apps that are written in other languages. 任意の Windows ランタイム型を使用することも、他のユニバーサル Windows プラットフォームアプリやコンポーネントが使用できるクラス、構造体、インターフェイス、およびその他のユーザー定義型を作成することもできます。You can consume any Windows Runtime type, or create classes, structs, interfaces, and other user-defined types that can be consumed by other Universal Windows Platform apps and components. C++/CX で記述されたユニバーサル Windows プラットフォームアプリは、パブリックアクセシビリティがない限り、通常の C++ クラスおよび構造体を使用することもできます。a Universal Windows Platform app that's written in C++/CX can also use regular C++ classes and structs as long as they don't have public accessibility.

C++/CX 言語プロジェクションと内部動作の詳しい説明については、次のブログ記事を参照してください。For an in-depth discussion of the C++/CX language projection and how it works under the covers, see these blog posts:

Windows メタデータ (.winmd) ファイルWindows metadata (.winmd) files

C++ で記述されたユニバーサル Windows プラットフォームアプリをコンパイルすると、コンパイラはネイティブコンピューターコードで実行可能ファイルを生成します。また、クラス、構造体、列挙体、インターフェイス、パラメーター化されたインターフェイス、デリゲートなど、パブリック Windows ランタイム型の説明を含む個別の Windows メタデータ (winmd) ファイルも生成します。When you compile a Universal Windows Platform app that's written in C++, the compiler generates the executable in native machine code, and also generates a separate Windows metadata (.winmd) file that contains descriptions of the public Windows Runtime types, which include classes, structs, enumerations, interfaces, parameterized interfaces, and delegates. メタデータの形式は、.NET Framework アセンブリで使用される形式に似ています。The format of the metadata resembles the format that's used in .NET Framework assemblies. C++ コンポーネントでは、.winmd ファイルにはメタデータのみ含まれています。実行可能コードは、別個のファイルに存在します。In a C++ component, the .winmd file contains only metadata; the executable code resides in a separate file. これは、Windows に含まれている Windows ランタイムコンポーネントの場合に当てはまります。This is the case for the Windows Runtime components that are included with Windows. WinMD ファイルの名前はソース コードのルート名前空間のプレフィックスに一致またはそれ自体である必要があります。The WinMD file name must match or be a prefix of the root namespace in the source code. (.NET Framework 言語の場合、.winmd ファイルには、.NET Framework アセンブリのようにコードとメタデータの両方が含まれます。)(For .NET Framework languages, the .winmd file contains both the code and the metadata, just like a .NET Framework assembly.)

.winmd ファイルのメタデータは、コードの公開されたサーフェイスを表します。The metadata in the .winmd file represents the published surface of your code. 他のアプリがどの言語で記述されているかにかかわらず、公開されている型は他のユニバーサル Windows プラットフォームにも表示されます。Published types are visible to other Universal Windows Platforms no matter what language those other apps are written in. したがって、メタデータまたは公開されたコードには、Windows ランタイム型システムによって指定された型のみを含めることができます。Therefore, the metadata, or your published code, can only contain types specified by the Windows Runtime type system. 標準クラス、配列、テンプレートまたは STL コンテナーなど、C++ 固有の言語構造体は、メタデータで発行できません。理由は、JavaScript または C# クライアント アプリケーションが対処できないからです。Language constructs that are specific to C++, such as regular classes, arrays, templates or STL containers, cannot be published in metadata because a Javascript or C# client app would not know what to do with them.

型またはメソッドがメタデータに表示されるかどうかは、適用されるアクセシビリティ修飾子によって異なります。Whether a type or method is visible in metadata depends on what accessibility modifiers are applied to it. 型を表示するには、型が名前空間で宣言され、パブリックとして宣言されている必要があります。To be visible, a type must be declared in a namespace and must be declared as public. 非パブリックの ref クラスは、コード内で内部ヘルパー型として許可されています。これは、メタデータでは表示されません。A non-public ref class is permitted as an internal helper type in your code; it just isn't visible in the metadata. パブリック ref クラスでも、すべてのメンバーが表示されるとは限りません。Even in a public ref class, not all members are necessarily visible. 次の表は、パブリック ref クラスでの C++ アクセス指定子と Windows ランタイムメタデータの可視性の関係を示しています。The following table lists the relationship between C++ access specifiers in a public ref class, and Windows Runtime metadata visibility:

メタデータで公開Published in metadata メタデータで非公開Not published in metadata
publicpublic privateprivate
protectedprotected internalinternal
public protectedpublic protected private protectedprivate protected

.winmd ファイルの内容を表示するために、 オブジェクト ブラウザー を使用できます。You can use the Object Browser to view the contents of .winmd files. Windows に含まれる Windows ランタイムコンポーネントは、Windows の winmd ファイルにあります。The Windows Runtime components that are included with Windows are in the Windows.winmd file. 既定の winmd ファイルには、C++/CX で使用される基本的な型が含まれています。また、platform.object には、Platform 名前空間からの追加の型が含まれています。The default.winmd file contains the fundamental types that are used in C++/CX, and platform.winmd contains additional types from the Platform namespace. 既定では、これら3つの winmd ファイルは、ユニバーサル Windows プラットフォームアプリのすべての C++ プロジェクトに含まれています。By default, these three .winmd files are included in every C++ project for Universal Windows Platform apps.

ヒント

Platform::Collections Namespace 型は、パブリックではないので、.winmd ファイルには表示されません。The types in the Platform::Collections Namespace don't appear in the .winmd file because they are not public. これらは、 Windows::Foundation::Collectionsで定義されているインターフェイスのプライベート C++ 固有の実装です。They are private C++-specific implementations of the interfaces that are defined in Windows::Foundation::Collections. JavaScript または C# で記述された Windows ランタイムアプリは、 Platform:: Collections:: Vector クラス がどのようなものであるかを認識しませんが、を使用することはでき Windows::Foundation::Collections::IVector ます。A Windows Runtime app that's written in JavaScript or C# doesn't know what a Platform::Collections::Vector Class is, but it can consume a Windows::Foundation::Collections::IVector. Platform::Collections 型は、collection.h で定義されます。The Platform::Collections types are defined in collection.h.

C++/CX の Windows ランタイム型システムWindows Runtime type system in C++/CX

次のセクションでは、Windows ランタイム型システムの主な機能と、C++/CX でサポートされるしくみについて説明します。The following sections describe the major features of the Windows Runtime type system and how they are supported in C++/CX.

名前空間Namespaces

すべての Windows ランタイム型は名前空間内で宣言する必要があります。Windows API 自体は、名前空間によって整理されています。All Windows Runtime types must be declared within a namespace; the Windows API itself is organized by namespaces. .winmd ファイルには、ルート名前空間と同じ名前が必要です。A .winmd file must have the same name that the root namespace has. たとえば、A.B.C.MyClass という名前のクラスは、A.winmd または A.B.winmd または A.B.C.winmd という名前のメタデータ ファイルで定義されている場合のみインスタンス化できます。For example, a class that's named A.B.C.MyClass can be instantiated only if it's defined in a metadata file that's named A.winmd or A.B.winmd or A.B.C.winmd. DLL の名前が .winmd ファイル名と一致する必要はありません。The name of the DLL is not required to match the .winmd file name.

Windows API 自体が、名前空間ごとに構成された、十分にファクタリングされたクラス ライブラリとして再開発されました。The Windows API itself has been reinvented as a well-factored class library that's organized by namespaces. すべての Windows ランタイムコンポーネントは、Windows. * 名前空間で宣言されています。All Windows Runtime components are declared in the Windows.* namespaces.

詳細については、「 名前空間と型の可視性」を参照してください。For more information, see Namespaces and Type Visibility.

基本的な型Fundamental types

Windows ランタイムでは、UInt8、Int16、UInt16、Int32、UInt32、Int64、UInt64、Single、Double、Char16、Boolean、および String の基本型が定義されています。The Windows Runtime defines the following fundamental types, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Char16, Boolean, and String. C++/CX では、uint16、uint32、uint64、int16、int32、int64、float32、float64、および char16 として、既定の名前空間の基本的な数値型がサポートされています。C++/CX supports the fundamental numeric types in its default namespace as uint16, uint32, uint64, int16, int32, int64, float32, float64, and char16. ブール値と文字列も、Platform 名前空間で定義されます。Boolean and String are also defined in the Platform namespace.

C++/CX では、uint8 も定義 unsigned char されています。これは Windows ランタイムではサポートされておらず、パブリック api では使用できません。C++/CX also defines uint8, equivalent to unsigned char, which is not supported in the Windows Runtime and cannot be used in public APIs.

基本型を null 許容にするには、 Platform::IBox インターフェイス にラップします。A fundamental type may be made nullable by wrapping it in a Platform::IBox Interface interface. 詳細については、「 値クラスと構造体で定義されているインターフェイスのプライベート C++ 固有の実装です。For more information, see Value classes and structs.

基本型の詳細については、「 基本型For more information about fundamental types, see Fundamental types

文字列Strings

Windows ランタイム文字列は、16ビットの UNICODE 文字の変更できないシーケンスです。A Windows Runtime string is an immutable sequence of 16-bit UNICODE characters. Windows ランタイム文字列はとして投影され Platform::String^ ます。A Windows Runtime string is projected as Platform::String^. このクラスには、文字列の構築、操作、およびからの変換のためのメソッドが用意されて wchar_t います。This class provides methods for string construction, manipulation, and conversion to and from wchar_t.

詳細については、「 文字列で定義されているインターフェイスのプライベート C++ 固有の実装です。For more information, see Strings.

配列Arrays

Windows ランタイムは、任意の型の1次元配列をサポートしています。The Windows Runtime supports 1-dimensional arrays of any type. 配列の配列はサポートされていません。Arrays of arrays are not supported. C++/CX では、Windows ランタイム配列は Platform:: Array クラスとして射影されます。In C++/CX, Windows Runtime arrays are projected as the Platform::Array Class.

詳細については、「 array と WriteOnlyArray 」を参照してください。For more information, see Array and WriteOnlyArray

Ref クラスと構造体Ref classes and structs

Windows ランタイムクラスは、参照によってコピーされるため、C++/CX で ref クラスまたは ref 構造体として射影されます。A Windows Runtime class is projected in C++/CX as a ref class or ref struct, because they are copied by reference. ref クラスと ref 構造体のメモリ管理は、参照カウントによって透過的に処理されます。Memory management for ref classes and ref structs is handled transparently by means of reference counting. オブジェクトへの最後の参照がスコープ外に出ると、オブジェクトは破棄されます。When the last reference to an object goes out of scope, the object is destroyed. ref クラスまたは ref 構造体では、次のことができます。A ref class or ref struct can:

  • コンストラクター、メソッド、プロパティ、およびイベントをメンバーとして格納できます。Contain as members constructors, methods, properties, and events. これらのメンバーには、パブリック、プライベート、プロテクト、または内部のアクセシビリティを指定できます。These members can have public, private, protected, or internal accessibility.

  • プライベートの入れ子になった構造体、列挙体、またはクラス定義を格納できます。Can contain private nested enum, struct, or class definitions.

  • 1 つの基底クラスから直接継承し、任意の数のインターフェイスを実装できます。Can directly inherit from one base class and can implement any number of interfaces. ref クラスは、いずれも Platform::Object Class に暗黙的に変換可能で、 Object::ToStringなどの仮想メソッドをオーバーライドできます。All ref classes are implicitly convertible to the Platform::Object Class and can override its virtual methods—for example, Object::ToString.

パブリック コンストラクターを持つ ref クラスは、さらに派生されることを防ぐために、シール済みとして宣言する必要があります。A ref class that has a public constructor must be declared as sealed, to prevent further derivation.

詳細については、「 Ref クラスと構造体」を参照してください。For more information, see Ref classes and structs

値クラスと構造体Value classes and structs

値クラスまたは値の構造体は、基本的なデータ構造体を表し、フィールドのみ格納できます。フィールドには、値クラス、値構造体、または Platform::String^型が含まれます。A value class or value struct represents a basic data structure and contains only fields, which may be value classes, value structs, or type Platform::String^. 値構造体と値クラスは、値によってコピーされます。Value structs and value classes are copied by value.

値構造体を null 許容にするには、IBox インターフェイスにラップします。A value struct can be made nullable by wrapping in an IBox interface.

詳細については、「 値クラスと構造体で定義されているインターフェイスのプライベート C++ 固有の実装です。For more information, see Value classes and structs.

部分クラスPartial classes

部分クラスの機能を使用して、1 つのクラスを複数のファイルに対して定義できます。The partial class feature enables one class to be defined over multiple files. この機能は主に、XAML エディターなどのコード生成ツールで、編集するファイルにアクセスせずに 1 つのファイルを変更するために使用されます。It's used primarily to enable code-generation tools such as the XAML editor to modify one file without touching the file that you edit.

詳細については、「 部分クラスFor more information, see Partial classes

PropertiesProperties

プロパティは、任意の Windows ランタイム型のパブリックデータメンバーであり、get/set メソッドのペアとして実装されます。A property is a public data member of any Windows Runtime type and is implemented as a get/set method pair. クライアント コードは、パブリック フィールドのようにプロパティにアクセスします。Client code accesses a property as if it were a public field. カスタムの get または set コードを必要とするプロパティは、 trivial プロパティ と呼ばれ、明示的な get または set メソッドを使用せずに宣言できます。A property that requires no custom get or set code is known as a trivial property and can be declared without explicit get or set methods.

詳細については、「 プロパティで定義されているインターフェイスのプライベート C++ 固有の実装です。For more information, see Properties.

C++/CX の Windows ランタイムコレクションWindows Runtime collections in C++/CX

Windows ランタイムは、各言語が独自の方法で実装するコレクション型の一連のインターフェイスを定義します。The Windows Runtime defines a set of interfaces for collection types that each language implements in its own way. C++/CX は、 platform:: collections:: Vector クラスPlatform:: Collections:: Map クラス、およびそれに対応する標準テンプレートライブラリ (STL) と互換性のあるその他の関連する具象コレクション型の実装を提供します。C++/CX provides implementations in the Platform::Collections::Vector Class, Platform::Collections::Map Class, and other related concrete collection types, which are compatible with their Standard Template Library (STL) counterparts.

詳細については、コレクション を参照してください。For more information, see Collections.

テンプレート ref クラスTemplate ref classes

プライベート ref クラスおよび内部 ref クラスは、テンプレート化および特化できます。Private and internal ref classes can be templated and specialized.

詳細については、「 テンプレート ref クラスで定義されているインターフェイスのプライベート C++ 固有の実装です。For more information, see Template ref classes.

インターフェイスInterfaces

Windows ランタイムインターフェイスは、ref クラスまたは ref 構造体がインターフェイスから継承する場合に実装する必要があるパブリックプロパティ、メソッド、およびイベントのセットを定義します。A Windows Runtime interface defines a set of public properties, methods, and events that a ref class or ref struct must implement if it inherits from the interface.

詳細については、「インターフェイス」を参照してください。For more information, see Interfaces.

列挙型Enums

Windows ランタイムの列挙型クラスは、C++ のスコープ列挙型に似ています。An enum class in Windows Runtime resembles a scoped enum in C++. 基になる型は int32 です。[Flags] 属性が適用された場合、基になる型は uint32 です。The underlying type is int32, unless the [Flags] attribute is applied—in that case, the underlying type is uint32.

詳細については、「 列挙体で定義されているインターフェイスのプライベート C++ 固有の実装です。For more information, see Enums.

代理人Delegates

Windows ランタイム内のデリゲートは、C++ の std:: function オブジェクトに似ています。A delegate in the Windows Runtime is analogous to a std::function object in C++. これは、互換性のあるシグニチャを持つクライアント提供関数を呼び出すために使用される、特殊な種類の ref クラスです。It's a special kind of ref class that's used to invoke client-provided functions that have compatible signatures. デリゲートは、イベントの種類として Windows ランタイムで最もよく使用されます。Delegates are most commonly used in the Windows Runtime as the type of an event.

詳細については、「デリゲート」を参照してください。For more information, see Delegates.

例外Exceptions

C++/CX では、カスタムの例外の種類、 std::exception 型、および Platform::Exception 型をキャッチできます。In C++/CX, you can catch custom exception types, std::exception types, and Platform::Exception types.

詳細については、「 例外で定義されているインターフェイスのプライベート C++ 固有の実装です。For more information, see Exceptions.

イベントEvents

イベントは、型がデリゲート型の、ref クラスまたは ref 構造体のパブリック メンバーです。An event is a public member in a ref class or ref struct whose type is a delegate type. イベントに対して可能なのは、所有するクラスによる呼び出し (つまり、発生) だけです。An event can only be invoked—that is, fired—by the owning class. ただし、クライアント コードが独自の関数を提供することはできます。それらの関数はイベント ハンドラーと呼ばれ、所有クラスでイベントが発生したときに呼び出されます。However, client code can provide its own functions, which are known as event handlers and are invoked when the owning class fires the event.

詳細については、「イベント」を参照してください。For more information, see Events.

キャストCasting

C++/CX は、標準 C++ のキャスト演算子 static_castdynamic_cast、および reinterpret_castをサポートし、C++/CX に固有の safe_cast 演算子もサポートします。C++/CX supports the standard C++ cast operators static_cast, dynamic_cast, and reinterpret_cast, and also the safe_cast operator that's specific to C++/CX.

詳細については、「 キャストで定義されているインターフェイスのプライベート C++ 固有の実装です。For more information, see Casting.

ボックス化Boxing

ボックス化された変数は、参照セマンティクスが必要な場合に参照型にラップされる値の型です。A boxed variable is a value type that's wrapped in a reference type in situations where reference semantics are required.

詳細については、「 ボックス化で定義されているインターフェイスのプライベート C++ 固有の実装です。For more information, see Boxing.

属性Attributes

属性は、任意の Windows ランタイム型または型のメンバーに適用でき、実行時に検査できるメタデータ値です。An attribute is a metadata value that can be applied to any Windows Runtime type or type member and can be inspected at run time. Windows ランタイムは、名前空間の一連の共通属性を定義し Windows::Foundation::Metadata ます。The Windows Runtime defines a set of common attributes in the Windows::Foundation::Metadata namespace. パブリックインターフェイスのユーザー定義属性は、このリリースの Windows ランタイムではサポートされていません。User-defined attributes on public interfaces are not supported by Windows Runtime in this release.

API の非推奨API Deprecation

Windows ランタイムシステム型で使用されているのと同じ属性を使用して、パブリック Api を非推奨としてマークする方法について説明します。Describes how to mark public APIs as deprecated by using the same attribute that's used by the Windows Runtime system types.

詳細については、「 非推奨 types and members」を参照してください。For more information, see Deprecating types and members.

関連項目See also

C++/CX 言語リファレンスC++/CX Language Reference