Dela via


Typsystemöversikt (C++/CX)

Med hjälp av Windows Runtime-arkitekturen kan du använda C++/WinRT, C++/CX, Visual Basic, Visual C# och JavaScript för att skriva appar och komponenter. De kan komma åt Windows API direkt och samverka med andra Windows Runtime-appar och -komponenter. UWP-appar (Universal Windows Platform) som är skrivna i C++ kompileras till inbyggd kod som körs direkt i processorn. UWP-appar som är skrivna i C# eller Visual Basic kompileras till Microsofts mellanliggande språk (MSIL) och körs i CLR (Common Language Runtime). UWP-appar som är skrivna i JavaScript körs i en JavaScript-körningsmiljö. Själva Windows Runtime-operativsystemkomponenterna är skrivna i C++ och körs som intern kod. Alla dessa komponenter och UWP-appar kommunicerar direkt via Windows Runtime-programmets binära gränssnitt (ABI).

För att aktivera stöd för Windows Runtime i ett modernt C++-idiom skapade Microsoft språktillägget C++/CX. C++/CX tillhandahåller inbyggda bastyper och implementeringar av grundläggande Windows Runtime-typer. Med de här typerna kan C++-appar och komponenter kommunicera i ABI med appar som skrivits på andra språk. C++/CX-appar kan använda valfri Windows Runtime-typ. De kan också skapa klasser, strukturer, gränssnitt och andra användardefinierade typer som andra UWP-appar och komponenter kan använda. En UWP-app som är skriven i C++/CX kan också använda vanliga C++-klasser och structs, så länge de inte har offentlig tillgänglighet.

En djupgående diskussion om C++/CX-språkprojektionen och hur den fungerar under omslagen finns i följande blogginlägg:

Anmärkning

C++/CX stöds fortfarande, men vi rekommenderar att du använder C++/WinRT för nya Windows Runtime-appar och -komponenter i stället. Den är utformad för att ge dig förstklassig åtkomst till det moderna Windows-API:et. Trots namnet använder C++/WinRT endast standard C++17 utan tillägg. Det använder ett huvudbibliotek för att implementera en C++-språkprojektion för Windows Runtime-API:er. C++/WinRT är tillgängligt i Windows SDK från version 1803 (10.0.17134.0) och senare.

Windows-metadatafiler (.winmd)

När du kompilerar en UWP-app som är skriven i C++, genererar kompilatorn den körbara filen i inbyggd datorkod och genererar även en separat Windows-metadatafil (.winmd) som innehåller beskrivningar av de offentliga Windows Runtime-typerna, som omfattar klasser, structs, uppräkningar, gränssnitt, parametriserade gränssnitt och ombud. Metadataformatet liknar det format som används i .NET Framework-sammansättningar. I en C++-komponent .winmd innehåller filen endast metadata. Den körbara koden finns i en separat fil. Windows Runtime-komponenterna som ingår i Windows använder det här arrangemanget. Ett .winmd filnamn måste matcha eller vara ett prefix för rotnamnområdet i källkoden. (För .NET Framework-språk .winmd innehåller filen både koden och metadata, precis som en .NET Framework-sammansättning.)

Metadata i .winmd filen representerar den publicerade ytan av koden. Publicerade typer är synliga för andra UWP-appar oavsett vilket språk de andra apparna är skrivna i. Metadata, eller din publicerade kod, kan bara innehålla typer som anges av Windows Runtime-typsystemet. Du kan inte publicera C++-specifika språkkonstruktioner, till exempel vanliga klasser, matriser, mallar eller STL-containrar (C++ Standard Library). En JavaScript- eller C#-klientapp vet inte vad de ska göra med dem.

Om en typ eller metod visas i metadata beror på vilka hjälpmedelsmodifierare som tillämpas på den. För att vara synlig måste en typ deklareras i ett namnområde och deklareras som public. En icke-tillåtspublicref class som en intern hjälptyp i din kod. Den visas bara inte i metadata. Även i en public ref classär inte alla medlemmar nödvändigtvis synliga. I följande tabell visas relationen mellan C++-åtkomstspecificerare i en public ref class, och Windows Runtime-metadatasynlighet:

Publicerad i metadata Inte publicerad i metadata
public private
protected internal
public protected private protected

Du kan använda Objektläsaren för att visa innehållet i .winmd filer. Windows Runtime-komponenterna som ingår i Windows finns i Windows.winmd filen. Filen default.winmd innehåller de grundläggande typer som används i C++/CX och platform.winmd innehåller typer från Platform namnområdet. Som standard ingår dessa tre .winmd filer i varje C++-projekt för UWP-appar.

Tips/Råd

Typerna Platform::Collections i namnområdet visas inte i .winmd filen eftersom de inte är offentliga. De är privata C++-specifika implementeringar av gränssnitten som definieras i Windows::Foundation::Collections. En Windows Runtime-app som är skriven i JavaScript eller C# vet inte vad en Platform::Collections::Vector klass är, men den kan använda en Windows::Foundation::Collections::IVector. Typerna Platform::Collections definieras i collection.h.

Windows Runtime-typsystem i C++/CX

I följande avsnitt beskrivs de viktigaste funktionerna i Windows Runtime-typsystemet och hur de stöds i C++/CX.

Namnområden

Alla Windows Runtime-typer måste deklareras inom ett namnområde. Själva Windows-API:et ordnas efter namnområde. En .winmd fil måste ha samma namn som rotnamnområdet. En klass med namnet A.B.C.MyClass kan till exempel bara instansieras om den definieras i en metadatafil med namnet A.winmd, A.B.winmdeller A.B.C.winmd. Namnet på DLL:en krävs inte för att matcha .winmd filnamnet.

Själva Windows-API:et har återuppfunnits som ett välfaktoriserat klassbibliotek som organiseras av namnområden. Alla Windows Runtime-komponenter deklareras i Windows.* namnrymderna.

Mer information finns i Namnområden och skriv synlighet.

Grundläggande typer

Windows Runtime definierar följande grundläggande typer: , , , , , , Int64, UInt64, Single, , Double, Char16, , Booleanoch String. UInt32Int32UInt16Int16UInt8 C++/CX stöder de grundläggande numeriska typerna i dess standardnamnområde som uint16, uint32, uint64, int16, int32, int64, float32, float64och char16. Boolean och String definieras också i Platform namnområdet.

C++/CX definierar uint8också , motsvarande unsigned char, som inte stöds i Windows Runtime och inte kan användas i offentliga API:er.

En grundläggande typ kan göras null genom att omsluta den i ett Platform::IBox gränssnitt. Mer information finns i Värdeklasser och structs.

Mer information om grundläggande typer finns i Grundläggande typer

Strängar

En Windows Runtime-sträng är en oföränderlig sekvens med 16-bitars UNICODE-tecken. En Windows Runtime-sträng projiceras som Platform::String^. Den här klassen innehåller metoder för strängkonstruktion, manipulering och konvertering till och från wchar_t.

Mer information finns i Strängar.

Matriser

Windows Runtime stöder endimensionella matriser av alla typer. Matriser med matriser stöds inte. I C++/CX projiceras Windows Runtime-matriser som Platform::Array klassen .

Mer information finns i Array och WriteOnlyArray.

ref class och ref struct typer

En Windows Runtime-klass projiceras i C++/CX som en ref class eller ref struct typ, eftersom den kopieras med referens. Minneshantering för ref class och ref struct objekt hanteras transparent genom referensräkning. När den sista referensen till ett objekt hamnar utanför omfånget förstörs objektet. En ref class eller ref struct en typ kan:

  • Innehåller som medlemmar konstruktorer, metoder, egenskaper och händelser. Dessa medlemmar kan ha public, private, protectedeller internal hjälpmedel.

  • Kan innehålla privata kapslade enumdefinitioner , structeller class definitioner.

  • Kan ärva direkt från en basklass och kan implementera valfritt antal gränssnitt. Alla ref class objekt kan implicit konverteras till Platform::Object klassen och kan åsidosätta dess virtuella metoder, Object::ToStringtill exempel .

En ref class som har en offentlig konstruktor måste deklareras som sealed, för att förhindra ytterligare härledning.

Mer information finns i Referensklasser och structs

value class och value struct typer

En value class eller value struct representerar en grundläggande datastruktur och innehåller endast fält, som kan vara value class typer, value struct typer eller typ Platform::String^. value struct och value class objekt kopieras efter värde.

En value struct kan göras null genom att omsluta den i ett IBox gränssnitt.

Mer information finns i Värdeklasser och structs.

Partiella klasser

Funktionen partiell klass gör att en klass kan definieras över flera filer. Det gör att kodgenereringsverktyg som XAML-redigeraren kan ändra en fil utan att röra vid en annan fil som du redigerar.

Mer information finns i Partiella klasser

Egenskaper

En egenskap är en offentlig datamedlem av valfri Windows Runtime-typ. Den deklareras och definieras med hjälp av nyckelordet property . En egenskap implementeras som ett get/set metodpar. Klientkoden får åtkomst till en egenskap som om den vore ett offentligt fält. En egenskap som inte kräver någon anpassad get egenskap eller set kod kallas för en trivial egenskap och kan deklareras utan explicita get eller set metoder.

Mer information finns i Egenskaper.

Windows Runtime-samlingar i C++/CX

Windows Runtime definierar en uppsättning gränssnitt för samlingstyper som varje språk implementerar på sitt eget sätt. C++/CX tillhandahåller implementeringar i Platform::Collections::Vector klassen, Platform::Collections::Map klassen och andra relaterade typer av betongsamlingar, som är kompatibla med deras C++ standardbiblioteksmotsvarigheter.

Mer information finns i Samlingar.

Malltyper ref class

private och internal åtkomsttyper ref class kan vara mallade och specialiserade.

Mer information finns i Referensklasser för mallar.

Gränssnitt

Ett Windows Runtime-gränssnitt definierar en uppsättning offentliga egenskaper, metoder och händelser som en ref class eller ref struct en typ måste implementera om det ärver från gränssnittet.

Mer information finns i Gränssnitt.

Enums

En enum class typ i Windows Runtime liknar ett omfång enum i C++. Den underliggande typen är int32, såvida inte attributet [Flags] tillämpas– i så fall är uint32den underliggande typen .

Mer information finns i Uppräkningar.

Delegeringar

Ett ombud i Windows Runtime motsvarar ett std::function objekt i C++. Det är en särskild ref class typ som används för att anropa funktioner som tillhandahålls av klienten och som har kompatibla signaturer. Ombud används oftast i Windows Runtime som typ av en händelse.

Mer information finns i Ombud.

Exceptions

I C++/CX kan du fånga anpassade undantagstyper, std::exception typer och Platform::Exception typer.

Mer information finns i Undantag.

Evenemang

En händelse är en offentlig medlem i en ref class eller ref struct vars typ är en ombudstyp. En händelse kan bara anropas – det vill: utlöst – av den ägande klassen. Klientkoden kan dock tillhandahålla sina egna händelsehanterarfunktioner, som anropas när den ägande klassen utlöser händelsen.

Mer information finns i Händelser.

Gjutning

C++/CX har stöd för C++-standardoperatorerna static_cast, dynamic_castoch reinterpret_cast, och även operatorn safe_cast som är specifik för C++/CX.

Mer information finns i Casting.

Boxning

En rutad variabel är en värdetyp som är omsluten i en referenstyp. Använd boxade variabler i situationer där referenssemantik krävs.

Mer information finns i Boxning.

Egenskaper

Ett attribut är ett metadatavärde som kan tillämpas på valfri Windows Runtime-typ eller typmedlem. Attribut kan inspekteras vid körning. Windows Runtime definierar en uppsättning vanliga attribut i Windows::Foundation::Metadata namnområdet. Användardefinierade attribut i offentliga gränssnitt stöds inte av Windows Runtime i den här versionen.

API-utfasning

Du kan markera offentliga API:er som inaktuella med samma attribut som används av Windows Runtime-systemtyperna.

Mer information finns i Inaktuella typer och medlemmar.

Se även

C++/CX-språkreferens