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 publicdeklariert werden. Ein Nicht--publicref 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::Collectionsdefiniert 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.hdefiniert.

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.MyClassA.winmd, A.B.winmdoder 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, DoubleSingleChar16UInt64Booleanund .String C++/CX unterstützt die grundlegenden numerischen Typen im Standardnamespace als , , , uint64int16, int32, int64, , float32, und float64char16. uint32uint16 Boolean und String werden auch im Platform Namespace definiert.

C++/CX definiert uint8außerdem , entspricht unsigned chardem, 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_tzu 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 classref 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ügenprotectedprivateinternal.

  • Kann private geschachtelte enum, structoder class Definitionen 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, z. B Object::ToString. .

Ein ref class öffentliches Konstruktor muss als deklariert sealedwerden, 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 uint32der 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_castreinterpret_castden safe_cast für C++/CX spezifischen static_castOperator.

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

C++-/CX-Sprachreferenz