Typsystem (C++/CX)

Mithilfe der Windows Runtime-Architektur können Sie C++/CX, Visual Basic, Visual C# und JavaScript verwenden, um Apps und Komponenten zu schreiben, die direkt auf die Windows-API zugreifen und mit anderen Windows Runtime-Apps und -Komponenten zusammenarbeiten. Universal Windows Platform-Apps, die in C++ geschrieben sind, werden in nativen Code kompiliert, der direkt in der CPU ausgeführt wird. Universal Windows Platform-Apps, die in C# oder Visual Basic geschrieben sind, werden in Microsoft Intermediate Language (MSIL) kompiliert und in der Common Language Runtime (CLR) ausgeführt. Universelle Windows Plattform-Apps, die in JavaScript geschrieben sind, werden in einer Laufzeitumgebung ausgeführt. Die Windows Runtime-Betriebssystemkomponenten selbst werden in C++ geschrieben und als nativer Code ausgeführt. Alle diese Komponenten und Universal Windows Platform-Apps kommunizieren direkt über die Windows Runtime Application Binary Interface (ABI).

Um die Unterstützung für die Windows Runtime in einem modernen C++-Idiom zu aktivieren, hat Microsoft C++/CX erstellt. C++/CX bietet integrierte Basistypen und Implementierungen grundlegender Windows Runtime-Typen, die es C++-Apps und -Komponenten ermöglichen, über die ABI mit Apps zu kommunizieren, die in anderen Sprachen geschrieben sind. Sie können jeden Windows Runtime-Typ nutzen oder Klassen, Strukturen, Schnittstellen und andere benutzerdefinierte Typen erstellen, die von anderen Universal Windows Platform-Apps und -Komponenten verwendet werden können. Eine universelle Windows-Plattform-App, die in C++/CX geschrieben ist, kann auch reguläre C++-Klassen und -Strukturen verwenden, solange sie keinen öffentlichen Zugriff haben.

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

Windows-Metadatendateien (.winmd)

Wenn Sie eine in C++ geschriebene Universelle Windows-Plattform-App kompilieren, generiert der Compiler die ausführbare Datei in systemeigenem Computercode und generiert außerdem eine separate Windows-Metadatendatei (WINMD), die Beschreibungen der öffentlichen Windows Runtime-Typen enthält, die Klassen, Strukturen, Enumerationen, Schnittstellen, parametrisierte Schnittstellen und Delegaten enthalten. 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. Dies ist der Fall für die Windows Runtime-Komponenten, die in den Windows. Der WinMD-Dateiname muss übereinstimmen oder ein Präfix des Stammnamenspace im Quellcode sein. (Für die .NET Framework-Sprachen sind in einer WinMD-Datei wie in einer .NET Framework-Assembly sowohl Code als auch Metadaten enthalten.)

Die Metadaten in der WinMD-Datei stellen die veröffentlichte Oberfläche des Codes dar. Veröffentlichte Typen sind für andere Universelle Windows-Plattformen sichtbar, unabhängig davon, in welcher Sprache diese anderen Apps geschrieben sind. Daher können die Metadaten oder ihr veröffentlichter Code nur Typen enthalten, die vom Windows Runtime-Typsystem angegeben werden. C++-spezifische Sprachkonstrukte wie reguläre Klassen, Arrays, Vorlagen oder STL-Container können nicht in Metadaten veröffentlicht werden, da eine JavaScript- oder C#-Clientapp sie nicht verwenden kann.

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 sowohl in einem Namespace als auch als öffentlich deklariert werden. Eine nicht öffentliche Verweisklasse ist als interner Hilfsprogrammtyp im Code zugelassen, wird jedoch nicht in den Metadaten angezeigt. Es sind jedoch auch in einer öffentlichen Verweisklasse nicht unbedingt alle Member sichtbar. In der folgenden Tabelle wird die Beziehung zwischen C++-Zugriffsspezifizierern in einer öffentlichen Verweisklasse und Windows Runtime-Metadatensichtbarkeit aufgeführt:

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

Mit dem Objektkatalog können Sie den Inhalt von WinMD-Dateien anzeigen. Die Windows Runtime-Komponenten, die in Windows enthalten sind, 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 zusätzliche Typen aus dem Platform-Namespace. Standardmäßig sind diese drei WINMD-Dateien in jedem C++-Projekt für Universelle Windows Plattform-Apps enthalten.

Tipp

Die im Platform::Collections Namespace vorhandenen Typen sind in der WinMD-Datei nicht sichtbar, da sie nicht öffentlich sind. Es sind private C++-spezifische Implementierungen der Schnittstellen, die in Windows::Foundation::Collectionsdefiniert sind. Eine Windows Runtime-App, die in JavaScript oder C# geschrieben ist, weiß nicht, was eine Platform::Collections::Vector-Klasse ist, kann aber Windows::Foundation::Collections::IVector nutzen. Die Platform::Collections -Typen werden in der Datei collection.h definiert.

Windows Laufzeittypsystem in C++/CX

In den folgenden Abschnitten werden die wichtigsten Features des Windows Runtime-Typsystems beschrieben und 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 organisiert. Eine WinMD-Datei muss denselben Namen wie der Stammnamespace haben. Zum Beispiel kann eine Klasse namens A.B.C.MyClass nur instanziiert werden, wenn sie in einer Metadatendatei definiert ist, die A.winmd oder A.B.winmd oder A.B.C.winmd heißt. Der Name der DLL muss nicht mit dem Namen der WINMD-Datei ü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 namespaces Windows.* 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, UInt64, Single, Double, Char16, Boolean und String. C++/CX unterstützt die grundlegenden numerischen Typen im Standardnamespace wie uint16, uint32, uint64, int16, int32, int64, float32, float64 und char16. Boolean und String werden auch im Plattformnamespace definiert.

C++/CX definiert auch uint8, äquivalent zu , was in der Windows Runtime nicht unterstützt wird und nicht unsigned char in öffentlichen APIs verwendet werden kann.

Ein elementarer Typ kann auf NULL festlegbar gemacht werden, indem er in einer Platform::IBox Interface -Schnittstelle umgebrochen 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 für die Zeichenfolgenkonstruktion, -manipulation und -konvertierung in und aus zur wchar_t Seite.

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.

Referenzklassen und Strukturen

Eine Windows Runtime-Klasse wird in C++/CX als Verweisklasse oder Verweisstruktur projiziert, da sie als Verweis kopiert werden. Die Speicherverwaltung für Verweisklassen und Referenzstrukturen erfolgt mittels der Verweiszählung transparent. Wenn der letzte Verweis auf ein Objekt außerhalb des gültigen Bereichs ist, wird das Objekt vernichtet. Eine Verweisklasse oder Referenzstruktur

  • kann als Member Konstruktoren, Methoden, Eigenschaften und Ereignisse enthalten. Diese Member können einen öffentlichen, privaten, geschützten oder internen Zugriff aufweisen.

  • kann private geschachtelte Enumerations-, Struktur- oder Klassendefinitionen enthalten.

  • kann direkt von einer Basisklasse erben und eine beliebige Anzahl von Schnittstellen implementieren. Alle Verweisklassen sind implizit konvertierbar in die Platform::Object Class und können ihre virtuellen Methoden wie Object::ToStringüberschreiben.

Eine Verweisklasse, die über einen öffentlichen Konstruktor verfügt, muss als versiegelt deklariert werden, um eine weitere Ableitung zu verhindern.

Weitere Informationen finden Sie unter Referenzklassen und Strukturen

Wertklassen und Strukturen

Eine Wertklasse oder Wertstruktur stellt eine grundlegende Datenstruktur dar und enthält nur Felder, die Wertklassen, Wertstrukturen oder vom Typ Platform::String^sein können. Wertstrukturen und Wertklassen werden nach Wert kopiert.

Eine Wertstruktur kann auf NULL festlegbar gemacht werden, indem sie in einer IBox-Schnittstelle umgebrochen 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. Sie wird hauptsächlich dazu verwendet, um es Codegenerierungstools wie dem XAML-Editor ermöglichen, eine Datei zu ändern, ohne dass die Datei, die Sie bearbeiten, angefasst werden muss.

Weitere Informationen finden Sie unter Teilklassen

Eigenschaften

Eine Eigenschaft ist ein öffentlicher Daten member eines beliebigen Windows Runtime-Typs und 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 Laufzeitsammlungen in C++/CX

Die Windows Runtime definiert einen Satz von Schnittstellen für Auflistungstypen, die von jeder Sprache auf eigene Weise implementiert werden. C++/CX stellt Implementierungen in der Platform::Collections::Vector-Klasse, der Platform::Collections::Map-Klasseund anderen zugehörigen konkreten Auflistungstypen zur Verfügung, die mit ihren STL-Entsprechungen (Standard Template Library) kompatibel sind.

Weitere Informationen finden Sie unter Sammlungen.

Vorlagenverweisklassen

Private und interne Verweisklassen können vorlagenbasiert und spezialisiert sein.

Weitere Informationen finden Sie unter Vorlagenverweisklassendefiniert sind.

Schnittstellen

Eine Windows Runtime-Schnittstelle definiert einen Satz öffentlicher Eigenschaften, Methoden und Ereignisse, die eine Verweisklasse oder verweis-Struktur implementieren muss, wenn sie von der Schnittstelle erbt.

Weitere Informationen finden Sie unter Schnittstellen.

Enumerationen

Eine enum-Klasse in Windows Runtime ähnelt einer bereichsumfangsierten Enum in C++. Der zugrunde liegende Typ ist int32, es sei denn, das Attribut [Flags] kommt zur Anwendung. Dann ist der zugrunde liegende Typ uint32.

Weitere Informationen finden Sie unter Enumerationendefiniert sind.

Delegaten

Ein Delegat in Windows Runtime entspricht einem std::function-Objekt in C++. Es ist eine spezielle Verweisklasse, mit deren Hilfe vom Client bereitgestellte Funktionen aufgerufen werden, die kompatible Signaturen enthalten. Delegaten 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 öffentlicher Member in einer Verweisklasse oder einer Referenzstruktur mit einem Delegattyp als Typ. Ein Ereignis kann nur durch die besitzende Klasse aufgerufen, d. h. ausgelöst werden. Clientcode kann jedoch eigene Funktionen bereitstellen, die als Ereignishandler bezeichnet werden. Diese Ereignishandler werden aufgerufen, wenn die besitzende Klasse das Ereignis auslöst.

Weitere Informationen finden Sie unter Ereignisse.

Umwandlung

C++/CX unterstützt die Standard-C++-Umwandlungsoperatoren static_cast, dynamic_castund reinterpret_castsowie den Operator safe_cast , der C++/CX-spezifisch ist.

Weitere Informationen finden Sie unter Umwandlungdefiniert sind.

Boxing

Eine geschachtelte Variable ist ein Werttyp, der in einem Referenztyp in Situationen umschlossen wird, in denen eine Verweissemantik erforderlich ist.

Weitere Informationen finden Sie unter Boxingdefiniert sind.

Attribute

Ein Attribut ist ein Metadatenwert, der auf jeden Windows Runtimetyp oder Typ member angewendet und zur Laufzeit überprüft werden kann. Die Windows Runtime definiert einen Satz von allgemeinen Attributen im Windows::Foundation::Metadata Namespace. Benutzerdefinierte Attribute auf öffentlichen Schnittstellen werden von Windows Runtime in diesem Release nicht unterstützt.

API-Veraltung

Beschreibt, wie öffentliche APIs als veraltet markieren werden, indem das gleiche Attribut verwendet wird, das von den Windows Runtime-Systemtypen verwendet wird.

Weitere Informationen finden Sie unter Veraltete Typen und Member.

Siehe auch

C++/CX-Sprachreferenz