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 paspublic
ref 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.winmd
ou 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
, Int16
UInt16
Int32
UInt32
Int64
, UInt64
, Single
, , , Char16
Double
, , 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 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
, ,protected
private
ouinternal
l’accessibilité.Peut contenir des définitions imbriquées privées ou
struct
class
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 enPlatform::Object
classe et peuvent remplacer ses méthodes virtuelles, par exempleObject::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::Vector
classe 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_cast
de cast C++ standard, dynamic_cast
ainsi reinterpret_cast
que 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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour