Typsystemübersicht (C++/CX)
Mithilfe der Windows-Runtime-Architektur können Sie C++/WinRT, C++/CX, Visual Basic, Visual C# und JavaScript verwenden, um Apps und Komponenten zu schreiben. Sie können direkt auf die Windows-API zugreifen und mit anderen Windows-Runtime Apps und Komponenten zusammenarbeiten. Universelle Windows-Plattform (UWP)-Apps, die in C++-Kompilierung geschrieben wurden, in systemeigenen Code, der direkt in der CPU ausgeführt wird. UWP-Apps, die in C# oder Visual Basic geschrieben wurden, kompilieren in Microsoft Intermediate Language (MSIL) und werden in der Common Language Runtime (CLR) ausgeführt. UWP-Apps, die in JavaScript geschrieben wurden, werden in einer JavaScript-Laufzeitumgebung ausgeführt. Die Windows-Runtime Betriebssystemkomponenten selbst werden in C++ geschrieben und als systemeigener Code ausgeführt. Alle diese Komponenten und UWP-Apps kommunizieren direkt über die Windows-Runtime Anwendungs-Binärschnittstelle (Application Binary Interface, ABI).
Um die Unterstützung für die Windows-Runtime in einem modernen C++-Idiom zu aktivieren, hat Microsoft die C++/CX-Spracherweiterung erstellt. C++/CX bietet integrierte Basistypen und Implementierungen grundlegender Windows-Runtime Typen. Mit diesen Typen können C++-Apps und -Komponenten über die ABI hinweg mit Apps kommunizieren, die in anderen Sprachen geschrieben wurden. C++/CX-Apps können jeden beliebigen Windows-Runtime Typ nutzen. Sie können auch Klassen, Strukturen, Schnittstellen und andere benutzerdefinierte Typen erstellen, die andere UWP-Apps und -Komponenten nutzen können. Eine in C++/CX geschriebene UWP-App kann auch reguläre C++-Klassen und -Strukturen verwenden, sofern sie keine öffentliche Barrierefreiheit haben.
Eine ausführliche Diskussion der C++/CX-Sprachprojektion und ihrer Funktionsweise finden Sie in folgenden Blogbeiträgen:
Hinweis
Während C++/CX weiterhin unterstützt wird, empfehlen wir, C++/WinRT stattdessen für neue Windows-Runtime Apps und Komponenten zu verwenden. Es wurde entwickelt, um Ihnen erstklassigen Zugriff auf die moderne Windows-API zu bieten. Trotz des Namens verwendet C++/WinRT nur standard C++17 ohne Erweiterungen. Sie verwendet eine schreibgeschützte Headerbibliothek, um eine C++-Sprachprojektion für Windows-Runtime-APIs zu implementieren. C++/WinRT ist in Windows SDK ab Version 1803 (10.0.17134.0) erhältlich.
Windows-Metadatendateien (.winmd)
Wenn Sie eine in C++ geschriebene UWP-App kompilieren, generiert der Compiler die ausführbare Datei im systemeigenen Computercode und generiert außerdem eine separate Windows-Metadatendatei (.winmd
) mit Beschreibungen der öffentlichen Windows-Runtime-Typen, einschließlich Klassen, Strukturen, Enumerationen, Schnittstellen, parametrisierten Schnittstellen und Delegaten. Das Format der Metadaten ähnelt dem Format, das in den .NET Framework-Assemblys verwendet wird. In einer C++-Komponente enthält die .winmd
Datei nur Metadaten. Der ausführbare Code befindet sich in einer separaten Datei. Die in Windows enthaltenen Windows-Runtime Komponenten verwenden diese Anordnung. Ein .winmd
Dateiname muss übereinstimmen oder ein Präfix des Stammnamespaces im Quellcode sein. (Für .NET Framework-Sprachen enthält die .winmd
Datei sowohl den Code als auch die Metadaten, genau wie eine .NET Framework-Assembly.)
Die Metadaten in der .winmd
Datei stellen die veröffentlichte Oberfläche des Codes dar. Veröffentlichte Typen sind für andere UWP-Apps sichtbar, unabhängig davon, in welcher Sprache diese anderen Apps geschrieben wurden. Die Metadaten oder der veröffentlichte Code können nur Vom Windows-Runtime Typsystem angegebene Typen enthalten. Sie können keine C++-spezifischen Sprachkonstrukte wie normale Klassen, Arrays, Vorlagen oder STL-Container (C++ Standard Library) veröffentlichen. Eine JavaScript- oder C#-Client-App wusste nicht, was sie mit ihnen tun sollen.
Ob ein Typ oder eine Methode in den Metadaten sichtbar ist, hängt davon ab, welche Zugriffsmodifizierer auf diesen Typ oder diese Methode angewendet werden. Um sichtbar zu sein, muss ein Typ in einem Namespace deklariert und als public
deklariert werden. Ein Nicht--public
ref class
ist als interner Hilfstyp in Ihrem Code zulässig. Er ist nur in den Metadaten nicht sichtbar. Auch in einem public ref class
, nicht alle Mitglieder sind notwendigerweise sichtbar. In der folgenden Tabelle sind die Beziehungen zwischen C++-Zugriffsbezeichnern in einem public ref class
, und Windows-Runtime Metadatensichtbarkeit aufgeführt:
In Metadaten veröffentlicht | Nicht in Metadaten veröffentlicht |
---|---|
public |
private |
protected |
internal |
public protected |
private protected |
Sie können den Objektbrowser verwenden, um den Inhalt von .winmd
Dateien anzuzeigen. Die in Windows enthaltenen Windows-Runtime Komponenten befinden sich in der Windows.winmd
Datei. Die default.winmd
Datei enthält die grundlegenden Typen, die in C++/CX verwendet werden, und platform.winmd
enthält Typen aus dem Platform
Namespace. Standardmäßig sind diese drei .winmd
Dateien in jedem C++-Projekt für UWP-Apps enthalten.
Tipp
Die Typen im Platform::Collections
Namespace werden nicht in der .winmd
Datei angezeigt, da sie nicht öffentlich sind. Sie sind private C++-spezifische Implementierungen der Schnittstellen, die in Windows::Foundation::Collections
definiert sind. Eine Windows-Runtime-App, die in JavaScript oder C# geschrieben wurde, weiß nicht, was eine Platform::Collections::Vector
Klasse ist, aber sie kann eine Windows::Foundation::Collections::IVector
. Die Platform::Collections
Typen werden in collection.h
definiert.
Windows-Runtime Typsystem in C++/CX
In den folgenden Abschnitten werden die wichtigsten Features des Windows-Runtime Typsystems und deren Unterstützung in C++/CX beschrieben.
Namespaces
Alle Windows-Runtime Typen müssen innerhalb eines Namespace deklariert werden. Die Windows-API selbst ist nach Namespace organisiert. Eine .winmd
Datei muss denselben Namen haben wie der Stammnamespace. Eine benannte Klasse kann beispielsweise nur instanziiert werden, wenn sie in einer Metadatendatei definiert ist, die den Namen A.B.C.MyClass
A.winmd
, A.B.winmd
oder A.B.C.winmd
. Der Name der DLL muss nicht mit dem .winmd
Dateinamen übereinstimmen.
Die Windows-API selbst wurde überarbeitet und präsentiert sich nun als gut gestaltete Klassenbibliothek, die nach Namespaces organisiert ist. Alle Windows-Runtime Komponenten werden in den Windows.*
Namespaces deklariert.
Weitere Informationen finden Sie unter Namespaces und Typsichtbarkeit.
Grundlegende Typen
Die Windows-Runtime definiert die folgenden grundlegenden Typen: UInt8
, , Int16
, UInt16
, Int32
, UInt32
, Int64
, Double
Single
Char16
UInt64
Boolean
und .String
C++/CX unterstützt die grundlegenden numerischen Typen im Standardnamespace als , , , uint64
int16
, int32
, int64
, , float32
, und float64
char16
. uint32
uint16
Boolean
und String
werden auch im Platform
Namespace definiert.
C++/CX definiert uint8
außerdem , entspricht unsigned char
dem, was in der Windows-Runtime nicht unterstützt wird und nicht in öffentlichen APIs verwendet werden kann.
Ein grundlegender Typ kann durch Umbruch in eine Platform::IBox
Schnittstelle nullwertet werden. Weitere Informationen finden Sie unter Wertklassen und Strukturendefiniert sind.
Weitere Informationen über grundlegende Typen finden Sie unter Grundlegende Typen
Zeichenfolgen
Eine Windows-Runtime Zeichenfolge ist eine unveränderliche Sequenz von 16-Bit-UNICODE-Zeichen. Eine Windows-Runtime Zeichenfolge wird als Platform::String^
projiziert. Diese Klasse stellt Methoden zum Erstellen und Bearbeiten von Zeichenfolgen zur Verfügung und ermöglicht, Zeichenfolgen in und aus wchar_t
zu konvertieren.
Weitere Informationen finden Sie unter Zeichenfolgendefiniert sind.
Arrays
Die Windows-Runtime unterstützt eindimensionale Arrays beliebiger Art. Arrays von Arrays werden nicht unterstützt. In C++/CX werden Windows-Runtime Arrays als Platform::Array
Klasse projiziert.
Weitere Informationen finden Sie unter Array
und WriteOnlyArray
.
ref class
und ref struct
Typen
Eine Windows-Runtime Klasse wird in C++/CX als Typ ref class
ref struct
projiziert, da sie nach Verweis kopiert wird. Die Speicherverwaltung für ref class
und ref struct
Objekte wird transparent über die Verweiszählung behandelt. Wenn der letzte Verweis auf ein Objekt außerhalb des gültigen Bereichs ist, wird das Objekt vernichtet. Ein ref class
oder ref struct
Typ kann:
kann als Member Konstruktoren, Methoden, Eigenschaften und Ereignisse enthalten. Diese Mitglieder können
public
über Barrierefreiheit verfügenprotected
private
internal
.Kann private geschachtelte
enum
,struct
oderclass
Definitionen enthalten.kann direkt von einer Basisklasse erben und eine beliebige Anzahl von Schnittstellen implementieren. Alle
ref class
Objekte sind implizit in diePlatform::Object
Klasse konvertierbar und können ihre virtuellen Methoden überschreiben, z. BObject::ToString
. .
Ein ref class
öffentliches Konstruktor muss als deklariert sealed
werden, um eine weitere Ableitung zu verhindern.
Weitere Informationen finden Sie unter Referenzklassen und Strukturen
value class
und value struct
Typen
A value class
oder value struct
stellt eine grundlegende Datenstruktur dar und enthält nur Felder, die Typen, value struct
Typen oder Typ Platform::String^
sein value class
können. value struct
und value class
Objekte werden nach Wert kopiert.
Eine value struct
kann nullwertig gemacht werden, indem sie in eine IBox
Schnittstelle eingeschlossen wird.
Weitere Informationen finden Sie unter Wertklassen und Strukturendefiniert sind.
Teilklassen
Mit der Funktion der Teilklassen kann eine Klasse für mehrere Dateien definiert werden. Damit können Codegenerierungstools wie der XAML-Editor eine Datei ändern, ohne eine andere Datei zu berühren, die Sie bearbeiten.
Weitere Informationen finden Sie unter Teilklassen
Eigenschaften
Eine Eigenschaft ist ein öffentliches Datenelement eines beliebigen Windows-Runtime Typs. Sie wird mithilfe des property
Schlüsselwort (keyword) deklariert und definiert. Eine Eigenschaft wird als get
/set
Methodenpaar implementiert. Clientcode interpretiert eine Eigenschaft beim Zugriff als öffentliches Feld. Eine Eigenschaft, die keinen benutzerdefinierten get
Code set
erfordert, wird als triviale Eigenschaft bezeichnet und kann ohne explizite get
oder set
Methoden deklariert werden.
Weitere Informationen finden Sie unter Eigenschaftendefiniert sind.
Windows-Runtime Auflistungen in C++/CX
Die Windows-Runtime definiert eine Reihe von Schnittstellen für Sammlungstypen, die jede Sprache auf eigene Weise implementiert. C++/CX stellt Implementierungen in der Platform::Collections::Vector
Klasse, Platform::Collections::Map
Klasse und anderen verwandten konkreten Sammlungstypen bereit, die mit ihren C++-Standardbibliotheksentsprechungen kompatibel sind.
Weitere Informationen finden Sie unter Sammlungen.
Vorlagentypen ref class
private
und internal
Zugriffstypen ref class
können vorlagend und spezialisiert sein.
Weitere Informationen finden Sie unter Vorlagenverweisklassendefiniert sind.
Schnittstellen
Eine Windows-Runtime-Schnittstelle definiert eine Reihe öffentlicher Eigenschaften, Methoden und Ereignisse, die ein ref class
Oder-Typ ref struct
implementieren muss, wenn er von der Schnittstelle erbt.
Weitere Informationen finden Sie unter Schnittstellen.
Enumerationen
Ein enum class
Typ in der Windows-Runtime ähnelt einem Bereich enum
in C++. Der zugrunde liegende Typ lautet int32
, es sei denn, das Attribut [Flags] wird angewendet – in diesem Fall ist uint32
der zugrunde liegende Typ .
Weitere Informationen finden Sie unter Enumerationendefiniert sind.
Delegaten
Ein Delegat im Windows-Runtime entspricht einem std::function
Objekt in C++. Es ist ein spezieller ref class
Typ, der verwendet wird, um vom Client bereitgestellte Funktionen mit kompatiblen Signaturen aufzurufen. Stellvertretungen werden am häufigsten in der Windows-Runtime als Ereignistyp verwendet.
Weitere Informationen finden Sie unter Delegaten.
Ausnahmen
In C++/CX können Sie benutzerdefinierte Ausnahmetypen, std::exception
Typen und Platform::Exception
Typen abfangen.
Weitere Informationen finden Sie unter Ausnahmendefiniert sind.
Ereignisse
Ein Ereignis ist ein öffentliches Mitglied in einem ref class
oder ref struct
dessen Typ ein Delegattyp ist. Ein Ereignis kann nur durch die besitzende Klasse aufgerufen, d. h. ausgelöst werden. Clientcode kann jedoch eigene Ereignishandlerfunktionen bereitstellen, die aufgerufen werden, wenn die eigene Klasse das Ereignis auslöst.
Weitere Informationen finden Sie unter Ereignisse.
Umwandlung
C++/CX unterstützt die standardmäßigen C++-Umwandlungsoperatoren sowie dynamic_cast
reinterpret_cast
den safe_cast
für C++/CX spezifischen static_cast
Operator.
Weitere Informationen finden Sie unter Umwandlungdefiniert sind.
Boxing
Eine Boxvariable ist ein Werttyp, der in einen Bezugstyp eingeschlossen ist. Verwenden Sie Boxvariablen in Situationen, in denen Referenzsemantik erforderlich ist.
Weitere Informationen finden Sie unter Boxingdefiniert sind.
Attribute
Ein Attribut ist ein Metadatenwert, der auf jeden beliebigen Windows-Runtime Typ oder Typmemm angewendet werden kann. Attribute können zur Laufzeit überprüft werden. Die Windows-Runtime definiert einen Satz allgemeiner Attribute im Windows::Foundation::Metadata
Namespace. Benutzerdefinierte Attribute für öffentliche Schnittstellen werden von Windows-Runtime in dieser Version nicht unterstützt.
API-Veraltet
Sie können öffentliche APIs als veraltet kennzeichnen, indem Sie dasselbe Attribut verwenden, das von den Windows-Runtime Systemtypen verwendet wird.
Weitere Informationen finden Sie unter veraltete Typen und Member.
Siehe auch
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für