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 :
Notes
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).
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
.
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.
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.
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
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.
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
.
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
ouinternal
.Peut contenir des définitions
enum
,struct
ouclass
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 classePlatform::Object
et peuvent substituer ses méthodes virtuelles, par exempleObject::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
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.
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.