Freigeben über


Übersicht über das Typsystem (C++/CX)

Im Rahmen der Windows-Runtime-Architektur können Sie C++/WinRT, C++/CX, Visual Basic, Visual C# und JavaScript verwenden, um Apps und Komponenten zu schreiben. Diese können direkt auf die Windows-API zugreifen und mit anderen Windows-Runtime-Apps und -Komponenten zusammenarbeiten. In C++ geschriebene UWP-Apps (Universelle Windows-Plattform) werden als nativer Code kompiliert, der direkt in der CPU ausgeführt wird. In C# oder Visual Basic geschriebene UWP-Apps werden in der Zwischensprache von Microsoft (Microsoft Intermediate Language, MSIL) kompiliert und in der Common Language Runtime (CLR) ausgeführt. In JavaScript geschriebene UWP-Apps werden in einer JavaScript-Runtimeumgebung ausgeführt. Die Windows-Runtime-Betriebssystemkomponenten selbst sind in C++ geschrieben und werden als nativer Code ausgeführt. Alle diese Komponenten und UWP-Apps kommunizieren direkt über die Windows-Runtime-Binärschnittstelle (Application Binary Interface, ABI).

Um die Unterstützung der Windows-Runtime in einer modernen C++-Sprache zu ermöglichen, 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 Binärschnittstelle mit Apps kommunizieren, die in anderen Programmiersprachen geschrieben wurden. C++/CX-Apps können jeden beliebigen Windows-Runtime-Typ nutzen. Außerdem können sie Klassen, Strukturen, Schnittstellen und andere benutzerdefinierte Typen erstellen, die von anderen UWP-Apps und -Komponenten genutzt werden können. Eine in C++/CX geschriebene UWP-App kann auch reguläre C++-Klassen und Strukturen verwenden, solange diese ohne öffentlichen Zugriff sind.

Eine ausführliche Diskussion der C++/CX-Sprachprojektion und ihrer Funktionsweise finden Sie in folgenden Blogbeiträgen:

Hinweis

C++/CX wird zwar weiterhin unterstützt, trotzdem wird empfohlen, für neue Windows-Runtime-Apps und -Komponenten C++/WinRT zu verwenden. Damit erhalten Sie erstklassigen Zugriff auf die moderne Windows-API. Trotz des Namens verwendet C++/WinRT nur Standard-C++17 ohne Erweiterungen. C++/WinRT 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, wird vom Compiler die ausführbare Datei in nativem Computercode generiert. Zudem wird eine separate Windows-Metadatendatei (.winmd) generiert, die die Beschreibungen der öffentlichen Windows-Runtime-Typen enthält, zu denen Klassen, Strukturen, Enumerationen, Schnittstellen, parametrisierte Schnittstellen und Delegaten gehören. Das Format der Metadaten ähnelt dem Format, das in den .NET Framework-Assemblys verwendet wird. In einer C++-Komponente enthält die Datei vom Typ .winmd nur Metadaten. Der ausführbare Code befindet sich in einer separaten Datei. Dieses Modell wird von den in Windows enthaltenen Windows-Runtime-Komponenten verwendet. Der Name einer Datei vom Typ .winmd muss mit dem Stammnamenspace im Quellcode übereinstimmen oder ein Präfix davon sein. (Bei .NET Framework-Sprachen enthält die Datei vom Typ .winmd sowohl den Code als auch die Metadaten – genau wie bei einer .NET Framework-Assembly.)

Die Metadaten in der Datei vom Typ .winmd stellen die veröffentlichte Oberfläche Ihres Codes dar. Veröffentlichte Typen sind für andere UWP-Apps sichtbar, unabhängig davon, in welcher Programmiersprache diese anderen Apps geschrieben sind. Die Metadaten (und Ihr veröffentlichter Code) können nur Typen enthalten, die vom Windows-Runtime-Typsystem angegeben werden. Sie können keine C++-spezifischen Sprachkonstrukte wie reguläre Klassen, Arrays, Vorlagen oder C++-STL-Container (Standard Library; Standardbibliothek) veröffentlichen. Diese könnten von einer JavaScript- oder C#-Client-App nicht verwendet werden.

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 sowie als public deklariert werden. Eine nicht öffentliche Verweisklasse (non-public ref class) ist als interner Hilfsprogrammtyp im Code zugelassen, aber in den Metadaten nicht sichtbar. Es sind jedoch auch in einer öffentlichen Verweisklasse (public ref class) nicht unbedingt alle Member sichtbar. Die folgende Tabelle zeigt die Beziehung zwischen C++-Zugriffsspezifizierern in einer öffentlichen Verweisklasse (public ref class) und der Sichtbarkeit von Windows-Runtime-Metadaten:

In Metadaten veröffentlicht Nicht in Metadaten veröffentlicht
public private
protected internal
public protected private protected

Sie können den Objektkatalog verwenden, um den Inhalt von Dateien des Typs .winmd anzuzeigen. Die in Windows enthaltenen Windows-Runtime-Komponenten befinden sich in der Datei Windows.winmd. Die Datei default.winmd enthält die grundlegenden Typen, die in C++/CX verwendet werden, und platform.winmd enthält Typen aus dem Platform-Namespace. Diese drei Dateien vom Typ .winmd sind standardmäßig in jedem C++-Projekt für UWP-Apps enthalten.

Tipp

Die im Platform::Collections-Namespace enthaltenen Typen sind in der Datei vom Typ .winmd nicht vorhanden, da sie nicht öffentlich sind. Bei ihnen handelt es sich um private C++-spezifische Implementierungen der Schnittstellen, die in Windows::Foundation::Collections definiert sind. In JavaScript oder C# geschriebene Windows-Runtime-Apps können mit einer Platform::Collections::Vector-Klasse nichts anfangen. Sie können aber Windows::Foundation::Collections::IVector nutzen. Die Platform::Collections-Typen sind in collection.h definiert.

Windows-Runtime-Typsystem in C++/CX

In den folgenden Abschnitten werden die wichtigsten Features des Windows-Runtime-Typsystems beschrieben, und es wird erläutert, wie sie in C++/CX unterstützt werden.

Namespaces

Alle Windows-Runtime-Typen müssen innerhalb eines Namespace deklariert werden. Die Windows-API selbst ist nach Namespaces strukturiert. Eine Datei vom Typ .winmd muss den gleichen Namen haben wie der Stammnamespace. Zum Beispiel kann eine Klasse namens A.B.C.MyClass nur instanziiert werden, wenn sie in einer Metadatendatei definiert ist, die A.winmd, A.B.winmd oder A.B.C.winmd heißt. Der Name der DLL muss nicht mit dem Namen der Datei vom Typ .winmd ü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 (C++/CX).

Grundlegende Typen

Die Windows-Runtime definiert die folgenden grundlegenden Typen: UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Char16, Boolean und String. C++/CX unterstützt die grundlegenden numerischen Typen im zugehörigen Standardnamespace als uint16, uint32, uint64, int16, int32, int64, float32, float64 und char16. Boolean und String werden auch im Platform-Namespace definiert.

C++/CX definiert auch uint8 (entspricht unsigned char). Dies wird in der Windows-Runtime nicht unterstützt und kann nicht in öffentlichen APIs verwendet werden.

Ein grundlegender Typ kann Nullwerte zulassen, indem er in eine Platform::IBox-Schnittstelle eingeschlossen wird. 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_tzu konvertieren.

Weitere Informationen finden Sie unter Zeichenfolgendefiniert sind.

Arrays

Die Windows-Runtime unterstützt eindimensionale Arrays eines beliebigen Typs. 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 ref class- oder ref struct-Typ projiziert, da sie nach Verweis kopiert wird. Die Speicherverwaltung für ref class- und ref struct-Objekte wird transparent mittels Referenzzä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 als Member Konstruktoren, Methoden, Eigenschaften und Ereignisse enthalten. Diese Member können Zugriff vom Typ public, private, protected oder internal haben.

  • kann private geschachtelte Definitionen vom Typ enum, struct oder class enthalten.

  • kann direkt von einer Basisklasse erben und eine beliebige Anzahl von Schnittstellen implementieren. Alle ref class-Objekte sind implizit in die Platform::Object-Klasse konvertierbar und können ihre virtuellen Methoden überschreiben (beispielsweise Object::ToString).

Eine Verweisklasse (ref class), die über einen öffentlichen Konstruktor verfügt, muss als sealed deklariert werden, um eine weitere Ableitung zu verhindern.

Weitere Informationen finden Sie unter Referenzklassen und Strukturen

value class- und value struct-Typen

Eine Wertklasse (value struct) oder Wertstruktur (value class) stellt eine grundlegende Datenstruktur dar und enthält nur Felder, bei denen es sich um value struct-Typen, um Platform::String^-Typen oder um den Typ value class handeln kann. value struct- und value class-Objekte werden nach Wert kopiert.

Eine Wertstruktur (value struct) kann Nullwerte zulassen, 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. Dadurch können Codegenerierungstools wie der XAML-Editor eine Datei ändern, ohne Auswirkungen auf eine andere von ihnen bearbeitete Datei zu haben.

Weitere Informationen finden Sie unter Teilklassen

Eigenschaften

Eine Eigenschaft ist ein öffentlicher Datenmember eines beliebigen Windows-Runtime-Typs. Sie wird mithilfe des Schlüsselworts property 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- oder set-Code erfordert, wird als trivial-Eigenschaft bezeichnet und kann ohne explizite get- oder set-Methoden deklariert werden.

Weitere Informationen finden Sie unter Eigenschaftendefiniert sind.

Windows-Runtime-Sammlungen in C++/CX

Die Windows-Runtime definiert eine Gruppe von Schnittstellen für Sammlungstypen, die von jeder Programmiersprache auf eigene Weise implementiert werden. C++/CX bietet Implementierungen in der Platform::Collections::Vector-Klasse, in der Platform::Collections::Map-Klasse und in anderen ähnlichen konkreten Sammlungstypen, die mit ihren jeweiligen Entsprechungen aus der C++-Standardbibliothek kompatibel sind.

Weitere Informationen finden Sie unter Auflistungen (C++/CX).

ref class-Vorlagentypen

ref class-Typen mit Zugriff vom Typ private oder internal können vorlagenbasiert und spezialisiert sein.

Weitere Informationen finden Sie unter Vorlagenverweisklassendefiniert sind.

Schnittstellen

Eine Windows-Runtime-Schnittstelle definiert eine Gruppe von öffentlichen Eigenschaften, Methoden und Ereignissen, die ein ref class- oder ref struct-Typ implementieren muss, wenn er von der Schnittstelle erbt.

Weitere Informationen finden Sie unter Schnittstellen.

Enumerationen

Ein enum class-Typ in der Windows-Runtime ähnelt einer bereichsbezogenen Enumeration (enum) in C++. Der zugrunde liegende Typ ist int32, es sei denn, das Attribut [Flags] wird angewendet. In diesem Fall ist der zugrunde liegende Typ uint32.

Weitere Informationen finden Sie unter Enumerationendefiniert sind.

Delegaten

Ein Delegat in der Windows-Runtime ist analog zu einem std::function-Objekt in C++. Es ist ein spezieller ref class-Typ, mit dessen Hilfe vom Client bereitgestellte Funktionen aufgerufen werden, die über kompatible Signaturen verfügen. Delegaten werden in der Windows-Runtime am häufigsten als Typ eines Ereignisses 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 öffentlicher Member in einer Verweisklasse (ref class) oder in einer Referenzstruktur (ref struct) mit einem Delegattyp als Typ. 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 besitzende Klasse das Ereignis auslöst.

Weitere Informationen finden Sie unter Ereignisse.

Umwandlung

C++/CX unterstützt die standardmäßigen C++-Umwandlungsoperatoren static_cast, dynamic_cast und reinterpret_cast sowie den für C++/CX spezifischen safe_cast-Operator.

Weitere Informationen finden Sie unter Umwandlungdefiniert sind.

Boxing

Eine geschachtelte Variable ist ein von einem Verweistyp umschlossener Werttyp. Verwenden Sie geschachtelte Variablen 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 -Typmember angewendet werden kann. Attribute können zur Laufzeit überprüft werden. Die Windows-Runtime definiert eine Gruppe allgemeiner Attribute im Windows::Foundation::Metadata-Namespace. Benutzerdefinierte Attribute in öffentlichen Schnittstellen werden von der Windows-Runtime in diesem Release nicht unterstützt.

API-Veraltung

Sie können öffentliche APIs als veraltet markieren, indem Sie das gleiche Attribute verwenden wie bei den Windows-Runtime-Systemtypen.

Weitere Informationen finden Sie unter Einstufen von Typen und Membern als veraltet.

Weitere Informationen

C++-/CX-Sprachreferenz