Partage via


Vue d’ensemble du système de types (C++/CX)

À l’aide de l’architecture Windows Runtime, vous pouvez utiliser C++/WinRT, C++/CX, Visual Basic, Visual C# et JavaScript pour écrire des applications et des composants. Ils peuvent accéder directement à l’API Windows et interagir avec d’autres applications et composants Windows Runtime. Les applications de plateforme Windows universelle (UWP) qui sont écrites en C++ sont compilées dans un code natif qui s’exécute directement dans le processeur. Les applications UWP écrites en C# ou Visual Basic sont compilées en langage MSIL (Microsoft Intermediate Langage) et exécutées dans le CLR (Common Language Runtime). Les applications UWP écrites en JavaScript sont exécutées dans un environnement d’exécution JavaScript. Les composants du système d’exploitation Windows Runtime eux-mêmes sont écrits en C++ et exécutés en tant que code natif. Tous ces composants et applications UWP communiquent directement via l’interface ABI (Application Binary Interface) Windows Runtime.

Pour prendre en charge Windows Runtime dans un idiome C++ moderne, Microsoft a créé l’extension de langage C++/CX. C++/CX fournit des types de base intégrés et des implémentations des types Windows Runtime fondamentaux. Ces types permettent aux applications et composants C++ de communiquer au sein de l’interface ABI avec les applications écrites dans d’autres langages. Les applications C++/CX peuvent consommer n’importe quel type Windows Runtime. Elles peuvent aussi créer des classes, des structs, des interfaces et d’autres types définis par l’utilisateur que d’autres applications et composants UWP peuvent consommer. Une application UWP écrite en C++/CX peut également utiliser les classes et structs C++ classiques tant qu’ils n’ont pas d’accès public.

Pour une discussion détaillée de la projection du langage C++/CX et de son fonctionnement réel, voir les billets de blog suivants :

Remarque

Même si C++/CX est toujours pris en charge, nous vous recommandons d’utiliser plutôt C++/WinRT pour les nouvelles applications et composants Windows Runtime. Il est conçu pour vous offrir un accès idéal à l’API Windows moderne. Malgré son nom, C++/WinRT utilise uniquement la norme C++17 sans extensions. Il utilise une bibliothèque uniquement d’en-têtes pour implémenter une projection de langage C++ pour les API Windows Runtime. C++/WinRT est disponible dans le SDK Windows à partir de la version 1803 (10.0.17134.0).

Fichiers de métadonnées Windows (.winmd)

Lorsque vous compilez une application UWP écrite en C++, le compilateur génère le fichier exécutable en code machine natif et un fichier de métadonnées Windows (.winmd) séparé qui contient les descriptions des types Windows Runtime publics comprenant les classes, structs, énumérations, interfaces, interfaces paramétrables et délégués. Le format des métadonnées est semblable au format utilisé dans les assemblys .NET Framework. Dans un composant C++, le fichier .winmd contient uniquement des métadonnées. Le code exécutable est dans un fichier distinct. Les composants Windows Runtime inclus dans Windows utilisent cette configuration. Le nom du fichier .winmd doit correspondre à l’espace de noms racine ou en être le préfixe dans le code source. (Pour les langages .NET Framework, le fichier .winmd contient le code et les métadonnées, tout comme un assembly .NET Framework.)

Les métadonnées du fichier .winmd représentent la surface publiée de votre code. Les types publiés sont visibles par les autres applications UWP, quel que soit le langage dans lequel ces autres applications sont écrites. Les métadonnées ou votre code publié ne peuvent contenir que des types spécifiés par le système de types Windows Runtime. Vous ne pouvez pas publier de constructions de langage spécifiques à C++, telles que des classes, tableaux, modèles ou conteneurs STL (Standard Library) C++ classiques. Une application cliente JavaScript ou C# ne saurait pas quoi en faire.

La visibilité d'un type ou d'une méthode dans les métadonnées dépend des modificateurs d'accessibilité qui lui sont appliqués. Pour être visible, un type doit être déclaré dans un espace de noms et comme public. Une ref class non public est autorisée comme type d’assistance interne dans votre code, mais elle n’est pas visible dans les métadonnées. Même dans une public ref class, les membres ne sont pas tous nécessairement visibles. Le tableau suivant répertorie la relation entre les spécificateurs d’accès C++ d’une public ref class et la visibilité des métadonnées Windows Runtime :

Publié dans les métadonnées Non publié dans les métadonnées
public private
protected internal
public protected private protected

Vous pouvez utiliser l’Explorateur d’objets pour afficher le contenu des fichiers .winmd. Les composants Windows Runtime inclus dans Windows se trouvent dans le fichier Windows.winmd. Le fichier default.winmd contient les types fondamentaux utilisés en C++/CX, tandis que platform.winmd contient les types de l’espace de noms Platform. Par défaut, ces trois fichiers .winmd sont inclus dans chaque projet C++ pour les applications UWP.

Conseil

Les types présents dans l’espace de noms Platform::Collections n’apparaissent pas dans le fichier .winmd parce qu’ils ne sont pas publics. Ce sont des implémentations propres à C++ privées des interfaces définies dans Windows::Foundation::Collections. Une application Windows Runtime écrite en JavaScript ou C# ne sait pas ce qu'est une classe Platform::Collections::Vector, mais elle peut consommer un Windows::Foundation::Collections::IVector. Les types Platform::Collections sont définis dans collection.h.

Système de types Windows Runtime en C++/CX

Les sections suivantes décrivent les principales fonctionnalités du système de types Windows Runtime et comment elles sont prises en charge en C++/CX.

Espaces de noms

Tous les types Windows Runtime doivent être déclarés dans un espace de noms. L'API Windows elle-même est organisée par espaces de noms. Un fichier .winmd doit avoir le même nom que l’espace de noms racine. Par exemple, une classe nommée A.B.C.MyClass peut être instanciée uniquement si elle est définie dans un fichier de métadonnées nommé A.winmd, A.B.winmd ou A.B.C.winmd. Le nom de la DLL ne doit pas nécessairement correspondre au nom du fichier .winmd.

L'API Windows elle-même a été réinventée sous la forme d'une bibliothèque de classes correctement factorisées, organisée par espaces de noms. Tous les composants Windows Runtime sont déclarés dans les espaces de noms Windows.*.

Pour plus d’informations, consultez Espaces de noms et visibilité des types.

Types fondamentaux

Windows Runtime définit les types fondamentaux suivants : UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Char16, Boolean et String. C++/CX prend en charge les types numériques fondamentaux dans son espace de noms par défaut en tant que uint16, uint32, uint64, int16, int32, int64, float32, float64 et char16. Boolean et String sont également définis dans l’espace de noms Platform.

C++/CX définit également uint8, équivalent à unsigned char, qui n’est pas pris en charge dans Windows Runtime et ne peut pas être utilisé dans les API publiques.

Il est possible de rendre Nullable un type fondamental en l’enveloppant dans une interface Platform::IBox. Pour plus d'informations, consultez Classes de valeur et structures de valeur.

Pour plus d'informations sur les types fondamentaux, consultez Types fondamentaux

Chaînes

Une chaîne Windows Runtime est une séquence immuable de caractères UNICODE 16 bits. Une chaîne Windows Runtime est projetée en tant que Platform::String^. Cette classe fournit des méthodes pour la construction, la manipulation, et la conversion des chaînes vers et à partir de wchar_t.

Pour plus d'informations, consultez Chaînes.

Tableaux

Windows Runtime prend en charge les tableaux unidimensionnels de n’importe quel type. Les tableaux de tableaux ne sont pas pris en charge. En C++/CX, les tableaux Windows Runtime sont projetés en tant que classe Platform::Array.

Pour plus d’informations, consultez Array et WriteOnlyArray.

Types ref class et ref struct

Une classe Windows Runtime est projetée en C++/CX en tant que type ref class ou ref struct parce qu’elle est copiée par référence. La gestion de la mémoire pour les objets ref class et ref struct est gérée de manière transparente par le biais du comptage de références. Lorsque la dernière référence à un objet devient hors de portée, l'objet est détruit. Un type ref class ou ref struct peut :

  • Contenir comme membres des constructeurs, méthodes, propriétés et événements. Ces membres peuvent avoir une accessibilité public, private, protected ou internal.

  • Peut contenir des définitions enum, struct ou class imbriquées privées.

  • Hériter directement d'une classe de base et implémenter un nombre quelconque d'interfaces. Tous les objets ref class sont implicitement convertibles en classe Platform::Object et peuvent substituer ses méthodes virtuelles, par exemple Object::ToString.

Une ref class qui a un constructeur public doit être déclarée comme sealed pour empêcher toute autre dérivation.

Pour plus d'informations, consultez Classes et structures de référence

Types value class et value struct

Une value class ou un value struct représente une structure de données de base qui contient uniquement des champs, qui peuvent être des types value class, des types value struct ou le type Platform::String^. Les objets value struct et value class sont copiés par valeur.

Il est possible de rendre Nullable un value struct en l’enveloppant dans une interface IBox.

Pour plus d'informations, consultez Classes de valeur et structures de valeur.

Classes partielles

La fonctionnalité de classe partielle permet à une classe d'être définie sur plusieurs fichiers. Elle permet aux outils de génération de code tels que l’éditeur XAML de modifier un fichier sans toucher à un autre fichier que vous modifiez.

Pour plus d'informations, consultez Classes partielles

Propriétés

Une propriété est un membre de données public de n’importe quel type Windows Runtime. Elle est déclarée et définie en utilisant le mot clé property. Une propriété est implémentée en tant que paire de méthodes get/set. Le code client accède à une propriété comme s'il s'agissait d'un champ public. Une propriété qui ne nécessite aucun code get ou set personnalisé est appelée une propriété triviale et peut être déclarée sans méthode get ou set explicite.

Pour plus d'informations, consultez Propriétés.

Collections Windows Runtime en C++/CX

Le Windows Runtime définit un jeu d’interfaces pour les types de collection que chaque langage implémente à sa façon. C++/CX fournit des implémentations dans la classe Platform::Collections::Vector, la classe Platform::Collections::Map et autres types de collection concrets associés, qui sont compatibles avec leurs équivalents STL (Standard Library) C++.

Pour plus d’informations, consultez Collections.

Types ref class de modèles

Les types private et internal access ref class peuvent être modélisés et spécialisés.

Pour plus d'informations, consultez Classes ref de modèle.

Interfaces

Une interface Windows Runtime définit un ensemble de propriétés, méthodes et événements publics qu’un type ref class ou ref struct doit implémenter s’il hérite de l’interface.

Pour plus d'informations, consultez Interfaces.

Énumérations

Un type enum class dans Windows Runtime ressemble à un enum délimité en C++. Le type sous-jacent est int32 sauf si l’attribut [Flags] est appliqué, auquel cas le type sous-jacent est uint32.

Pour plus d'informations, consultez Énumérations.

Délégués

Un délégué dans le Windows Runtime est analogue à un objet std::function en C++. C'est un type ref class spécial qui est utilisé pour appeler les fonctions fournies par le client qui ont des signatures compatibles. Les délégués sont le plus souvent utilisés dans Windows Runtime comme type d’un événement.

Pour plus d'informations, consultez Délégués.

Exceptions

En C++/CX, vous pouvez intercepter des types d’exceptions personnalisés, des types std::exception et des types Platform::Exception.

Pour plus d'informations, consultez Exceptions.

Événements

Un événement est un membre public d’une ref class ou d’un ref struct dont le type est un type délégué. Un événement ne peut être appelé, c'est-à-dire déclenché, que par la classe propriétaire. Toutefois, le code client peut fournir ses propres fonctions de gestionnaire d’événements, qui sont appelées lorsque la classe propriétaire déclenche l’événement.

Pour plus d’informations, consultez Événements.

Transtypage

C++/CX prend en charge les opérateurs de cast C++ standard static_cast, dynamic_cast et reinterpret_cast, ainsi que l’opérateur safe_cast qui est propre à C++/CX.

Pour plus d'informations, consultez Cast.

Boxing

Une variable boxed est un type valeur qui est enveloppé dans un type référence. Utilisez des variables boxed dans des situations où une sémantique de référence est requise.

Pour plus d'informations, consultez Boxing.

Attributs

Un attribut est une valeur de métadonnées qui peut être appliquée à un type ou membre de type Windows Runtime. Les attributs peuvent être inspectés au moment de l’exécution. Windows Runtime définit un ensemble d'attributs communs dans l’espace de noms Windows::Foundation::Metadata. Les attributs définis par l’utilisateur sur les interfaces publiques ne sont pas pris en charge par Windows Runtime dans cette version.

Dépréciation d’API

Vous pouvez marquer les API publiques comme dépréciées à l’aide du même attribut que celui utilisé par les types système Windows Runtime.

Pour plus d’informations, consultez Dépréciation de types et de membres.

Voir aussi

Informations de référence sur le langage C++/CX