Vue d’ensemble du système de type (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. plateforme Windows universelle applications (UWP) écrites en C++ compilées dans du code natif qui s’exécute directement dans l’UC. Les applications UWP écrites en C# ou Visual Basic sont compilées dans le langage intermédiaire Microsoft (MSIL) et s’exécutent dans le Common Language Runtime (CLR). Les applications UWP écrites en JavaScript s’exécutent dans un environnement d’exécution JavaScript. Les composants du système d’exploitation Windows Runtime eux-mêmes sont écrits en C++ et s’exécutent en tant que code natif. Tous ces composants et applications UWP communiquent directement via l’interface binaire de l’application Windows Runtime (ABI).

Pour activer la prise en charge de Windows Runtime dans une 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 de types Windows Runtime fondamentaux. Ces types permettent aux applications et composants C++ de communiquer entre l’ABI et les applications écrites dans d’autres langages. Les applications C++/CX peuvent consommer n’importe quel type Windows Runtime. Ils peuvent également 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 des classes et des structs C++ standard, tant qu’elles n’ont pas d’accessibilité publique.

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

Bien que C++/CX soit toujours pris en charge, nous vous recommandons d’utiliser C++/WinRT pour les nouvelles applications et composants Windows Runtime à la place. Il est conçu pour vous fournir un accès de première classe à l’API Windows moderne. Malgré le nom, C++/WinRT utilise uniquement la norme C++17 sans extensions. Il utilise une bibliothèque en-tête uniquement pour implémenter une projection de langage C++ pour les API Windows Runtime. C++/WinRT est disponible dans le Kit de développement logiciel (SDK) Windows à partir de la version 1803 (10.0.17134.0) à partir de la version 1803.

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

Lorsque vous compilez une application UWP écrite en C++, le compilateur génère l’exécutable dans le code d’ordinateur natif et génère également un fichier de métadonnées Windows distinct (.winmd) qui contient des descriptions des types Windows Runtime publics, qui incluent des classes, des structs, des énumérations, des interfaces, des interfaces paramétrées et des 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 .winmd fichier contient uniquement des métadonnées ; le code exécutable se trouve dans un fichier distinct. Les composants Windows Runtime inclus dans Windows utilisent cette disposition. Un .winmd nom de fichier doit correspondre ou être un préfixe de l’espace de noms racine dans le code source. (Pour les langages .NET Framework, le .winmd fichier contient à la fois le code et les métadonnées, comme un assembly .NET Framework.)

Les métadonnées du .winmd fichier représentent l’aire publiée de votre code. Les types publiés sont visibles par d’autres applications UWP quelle que soit la langue dans laquelle 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 type Windows Runtime. Vous ne pouvez pas publier de constructions de langage spécifiques à C++, telles que des classes, des tableaux, des modèles ou des conteneurs STL (C++Standard Library). Une application cliente JavaScript ou C# ne sait pas quoi faire avec eux.

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 doit être déclaré en tant que public. Un type d’assistance interne n’est paspublicref class autorisé dans votre code ; il n’est pas visible dans les métadonnées. Même dans un public ref class, tous les membres ne sont pas nécessairement visibles. Le tableau suivant répertorie la relation entre les spécificateurs d’accès C++ dans un 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 .winmd fichiers. Les composants Windows Runtime inclus dans Windows se trouvent dans le Windows.winmd fichier. Le default.winmd fichier contient les types fondamentaux utilisés dans C++/CX et platform.winmd contient des types à partir de l’espace Platform de noms. Par défaut, ces trois .winmd fichiers sont inclus dans chaque projet C++ pour les applications UWP.

Conseil

Les types dans l’espace Platform::Collections de noms n’apparaissent pas dans le .winmd fichier, car ils ne sont pas publics. Il s’agit d’implémentations privées spécifiques à C++des interfaces définies dans Windows::Foundation::Collections. Une application Windows Runtime écrite en JavaScript ou C# ne sait pas quelle Platform::Collections::Vector classe est, mais elle peut consommer un Windows::Foundation::Collections::IVector. Les Platform::Collections types sont définis dans collection.h.

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

Les sections suivantes décrivent les principales fonctionnalités du système de type Windows Runtime et la façon dont elles sont prises en charge dans 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 espace de noms. Un .winmd fichier 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.winmdou A.B.C.winmd. Le nom de la DLL n’est pas requis pour correspondre au nom de .winmd fichier.

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 Windows.* espaces de noms.

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

Types fondamentaux

Windows Runtime définit les types fondamentaux suivants : UInt8, Int16UInt16Int32UInt32Int64, UInt64, Single, , , Char16Double, , Booleanet .String C++/CX prend en charge les types numériques fondamentaux dans son espace de noms par défaut en tant que uint16, , uint32uint64, int16, int32, int64, , float32, float64et char16. Boolean et String sont également définis dans l’espace Platform de noms.

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

Un type fondamental peut être rendu nullable en l’encapsulant dans une Platform::IBox interface. 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 des tableaux unidimensionnels de n’importe quel type. Les tableaux de tableaux ne sont pas pris en charge. Dans C++/CX, les tableaux Windows Runtime sont projetés en tant que Platform::Array classe.

Pour plus d’informations, consultez Array et WriteOnlyArray.

ref class et ref struct types

Une classe Windows Runtime est projetée en C++/CX en tant que ref class ou ref struct type, car elle est copiée par référence. La gestion de la mémoire pour ref class et ref struct des objets est gérée de manière transparente via le 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 ref class ou ref struct type peut :

  • Contenir comme membres des constructeurs, méthodes, propriétés et événements. Ces membres peuvent avoir public, , protectedprivateou internal l’accessibilité.

  • Peut contenir des définitions imbriquées privées ou structclass imbriquéesenum.

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

Un ref class constructeur public doit être déclaré en tant que sealed, pour empêcher une dérivation supplémentaire.

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

value class et value struct types

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

Un value struct peut être rendu nullable en l’encapsulant dans une IBox interface.

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. Il 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 à l’aide du property mot clé. Une propriété est implémentée en tant que get/set paire de méthodes. 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 ou set personnalisé get n’est connue sous le nom de propriété triviale et peut être déclarée sans méthode ou set expliciteget.

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

Collections Windows Runtime en C++/CX

Windows Runtime définit un ensemble d’interfaces pour les types de collection que chaque langage implémente de sa propre manière. C++/CX fournit des implémentations dans la classe, Platform::Collections::Map laPlatform::Collections::Vectorclasse et d’autres types de collection concrets connexes, qui sont compatibles avec leurs équivalents de bibliothèque standard C++.

Pour plus d’informations, consultez Collections.

Types de ref class modèles

private et internal les types d’accès ref class peuvent être modèles 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 publiques, de méthodes et d’événements qu’un ref class ou ref struct type doit implémenter s’il hérite de l’interface.

Pour plus d'informations, consultez Interfaces.

Enums

Un enum class type dans Windows Runtime ressemble à une étendue enum en C++. Le type sous-jacent est int32, sauf si l’attribut [Indicateurs] est appliqué( dans ce cas, le type sous-jacent est uint32.

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

Délégués

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

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

Exceptions

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

Pour plus d'informations, consultez Exceptions.

Événements

Un événement est un membre public d’un ref class type délégué ou 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 static_castde cast C++ standard, dynamic_castainsi reinterpret_castque l’opérateur safe_cast spécifique à C++/CX.

Pour plus d'informations, consultez Cast.

Boxing

Une variable boxed est un type valeur qui est encapsulé dans un type référence. Utilisez des variables boxed dans des situations où la 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 à n’importe quel 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 Windows::Foundation::Metadata de noms. 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 de l’API

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

Pour plus d’informations, consultez Déprécier les types et les membres.

Voir aussi

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