Panoramica del sistema dei tipi (C++/CX)

Usando l'architettura di Windows Runtime, puoi usare C++/WinRT, C++/CX, Visual Basic, Visual C# e JavaScript per scrivere app e componenti. Possono accedere direttamente all'API di Windows e interagire con altre app e componenti di Windows Runtime. piattaforma UWP (Universal Windows Platform) app (UWP) scritte in C++ compilate in codice nativo che viene eseguito direttamente nella CPU. Le app UWP scritte in C# o Visual Basic vengono compilate in Microsoft Intermediate Language (MSIL) ed eseguite in Common Language Runtime (CLR). Le app UWP scritte in JavaScript vengono eseguite in un ambiente di runtime JavaScript. I componenti del sistema operativo Windows Runtime stessi vengono scritti in C++ ed eseguiti come codice nativo. Tutti questi componenti e app UWP comunicano direttamente tramite l'interfaccia ABI (Application Binary Interface) di Windows Runtime.

Per abilitare il supporto per Windows Runtime in un linguaggio C++ moderno, Microsoft ha creato l'estensione del linguaggio C++/CX. C++/CX fornisce tipi di base predefiniti e implementazioni di tipi fondamentali di Windows Runtime. Questi tipi consentono alle app e ai componenti C++ di comunicare tra L'ABI con le app scritte in altri linguaggi. Le app C++/CX possono utilizzare qualsiasi tipo di Windows Runtime. Possono anche creare classi, struct, interfacce e altri tipi definiti dall'utente che possono essere usati da altre app e componenti UWP. Un'app UWP scritta in C++/CX può anche usare classi e struct C++ normali, purché non abbiano accessibilità pubblica.

Per un'analisi approfondita della proiezione del linguaggio C++/CX e del modo in cui funziona, vedi questi post di blog:

Nota

Anche se C++/CX è ancora supportato, ti consigliamo di usare C++/WinRT per le nuove app e i nuovi componenti di Windows Runtime. È progettato per offrire l'accesso di prima classe all'API di Windows moderna. Nonostante il nome, C++/WinRT usa solo C++17 standard senza estensioni. Usa una libreria di sola intestazione per implementare una proiezione del linguaggio C++ per le API di Windows Runtime. C++/WinRT è disponibile in Windows SDK dalla versione 1803 (10.0.17134.0) successiva.

File di metadati di Windows (.winmd)

Quando compili un'app UWP scritta in C++, il compilatore genera l'eseguibile nel codice del computer nativo e genera anche un file di metadati (.winmd) Windows separato che contiene descrizioni dei tipi di Windows Runtime pubblici, che includono classi, struct, enumerazioni, interfacce, interfacce con parametri e delegati. Il formato dei metadati è simile a quello utilizzato negli assembly .NET Framework. In un componente C++ il .winmd file contiene solo metadati. Il codice eseguibile si trova in un file separato. I componenti Windows Runtime inclusi in Windows usano questa disposizione. Un .winmd nome file deve corrispondere o essere un prefisso dello spazio dei nomi radice nel codice sorgente. Per i linguaggi .NET Framework, il .winmd file contiene sia il codice che i metadati, proprio come un assembly .NET Framework.

I metadati nel .winmd file rappresentano la superficie pubblicata del codice. I tipi pubblicati sono visibili ad altre app UWP indipendentemente dal linguaggio in cui vengono scritte le altre app. I metadati, o il codice pubblicato, possono contenere solo i tipi specificati dal sistema di tipi di Windows Runtime. Non è possibile pubblicare costrutti di linguaggio specifici di C++, ad esempio classi normali, matrici, modelli o contenitori STL (Standard Library) C++. Un'app client JavaScript o C# non saprebbe cosa fare con loro.

La visibilità di un tipo o di un metodo nei metadati dipende da quali modificatori di accessibilità sono ad esso applicati. Per essere visibile, un tipo deve essere dichiarato in uno spazio dei nomi e deve essere dichiarato come public. publicref class Non è consentito come tipo di helper interno nel codice, ma non è visibile nei metadati. Anche in , public ref classnon tutti i membri sono necessariamente visibili. La tabella seguente elenca la relazione tra gli identificatori di accesso C++ in una public ref classvisibilità dei metadati di Windows Runtime:

Pubblicato nei metadati Non pubblicato nei metadati
public private
protected internal
public protected private protected

È possibile utilizzare Visualizzatore oggetti per visualizzare il contenuto dei .winmd file. I componenti di Windows Runtime inclusi in Windows sono disponibili nel Windows.winmd file . Il default.winmd file contiene i tipi fondamentali usati in C++/CX e platform.winmd contiene i tipi dello spazio dei Platform nomi . Per impostazione predefinita, questi tre .winmd file sono inclusi in ogni progetto C++ per le app UWP.

Suggerimento

I tipi nello Platform::Collections spazio dei nomi non vengono visualizzati nel .winmd file perché non sono pubblici. Sono implementazioni specifiche di C++private delle interfacce definite in Windows::Foundation::Collections. Un'app di Windows Runtime scritta in JavaScript o C# non conosce la Platform::Collections::Vector classe , ma può usare un oggetto Windows::Foundation::Collections::IVector. I Platform::Collections tipi sono definiti in collection.h.

Sistema di tipi Windows Runtime in C++/CX

Le sezioni seguenti descrivono le principali funzionalità del sistema dei tipi di Windows Runtime e il modo in cui sono supportate in C++/CX.

Namespaces (Spazi dei nomi)

Tutti i tipi di Windows Runtime devono essere dichiarati all'interno di uno spazio dei nomi; l'API Di Windows è organizzata in base allo spazio dei nomi. Un .winmd file deve avere lo stesso nome dello spazio dei nomi radice. Ad esempio, una classe denominata A.B.C.MyClass può essere creata un'istanza solo se è definita in un file di metadati denominato A.winmd, A.B.winmdo A.B.C.winmd. Il nome della DLL non deve corrispondere al nome del .winmd file.

La stessa interfaccia API di Windows è stata ripensata come libreria di classi con corretto factoring organizzata per spazio dei nomi. Tutti i componenti Windows Runtime vengono dichiarati negli spazi dei Windows.* nomi.

Per altre informazioni, vedere Spazi dei nomi e visibilità dei tipi.

Tipi fondamentali

Windows Runtime definisce i tipi fondamentali seguenti: UInt8, Int16, UInt16, Int32, UInt32, Int64, DoubleSingleChar16UInt64Booleane .String C++/CX supporta i tipi numerici fondamentali nel relativo spazio dei nomi predefinito come uint16, int32int64uint32int16float32uint64float64e .char16 Boolean e String sono definiti anche nello spazio dei Platform nomi .

C++/CX definisce uint8anche , equivalente a unsigned char, che non è supportato in Windows Runtime e non può essere usato nelle API pubbliche.

Un tipo fondamentale può essere reso nullable eseguendo il wrapping in un'interfaccia Platform::IBox . Per ulteriori informazioni, vedi Classi e struct di valore.

Per ulteriori informazioni sui tipi fondamentali, vedi Tipi fondamentali

Stringhe

Una stringa di Windows Runtime è una sequenza non modificabile di caratteri UNICODE a 16 bit. Una stringa di Windows Runtime viene proiettata come Platform::String^. Questa classe fornisce i metodi per la creazione, la modifica e la conversione di stringhe verso e da wchar_t.

Per ulteriori informazioni, vedi Stringhe.

Matrici

Windows Runtime supporta matrici unidimensionali di qualsiasi tipo. Le matrici di matrici non sono supportate. In C++/CX, le matrici di Windows Runtime vengono proiettate come Platform::Array classe .

Per altre informazioni, vedere Array e WriteOnlyArray.

ref classtipi e ref struct

Una classe Windows Runtime viene proiettata in C++/CX come ref class tipo o ref struct perché viene copiata per riferimento. La gestione della memoria per ref class gli oggetti e ref struct viene gestita in modo trasparente tramite il conteggio dei riferimenti. Quando l'ultimo riferimento a un oggetto esce dall'ambito, l'oggetto viene rimosso. Un ref class tipo o ref struct può:

  • Contengono costruttori, metodi, proprietà ed eventi come membri. Questi membri possono avere public, private, protectedo internal accessibilità.

  • Può contenere definizioni , structo class annidate enumprivate.

  • Possono ereditare direttamente da una classe di base e implementare un numero indefinito di interfacce. Tutti gli ref class oggetti sono convertibili in modo implicito nella classe e possono eseguire l'override Platform::Object dei relativi metodi virtuali, Object::ToStringad esempio .

Un ref class oggetto con un costruttore pubblico deve essere dichiarato come sealed, per impedire un'ulteriore derivazione.

Per ulteriori informazioni, vedi Classi e struct di riferimento

value classtipi e value struct

Un value class oggetto o value struct rappresenta una struttura di dati di base e contiene solo campi, che possono essere value class tipi, value struct tipi o tipo Platform::String^. value struct gli oggetti e value class vengono copiati in base al valore.

Un value struct oggetto può essere reso nullable eseguendo il wrapping in un'interfaccia IBox .

Per ulteriori informazioni, vedi Classi e struct di valore.

Classi parziali

La funzionalità classe parziale consente la definizione di una classe su più file. Consente agli strumenti di generazione del codice, ad esempio l'editor XAML, di modificare un file senza toccare un altro file modificato.

Per ulteriori informazioni, vedi Classi parziali

Proprietà

Una proprietà è un membro dati pubblico di qualsiasi tipo di Windows Runtime. Viene dichiarata e definita usando la property parola chiave . Una proprietà viene implementata come coppia di get/set metodi. Il codice client accede a una proprietà come se fosse un campo pubblico. Una proprietà che non richiede codice o set personalizzato get è nota come proprietà semplice e può essere dichiarata senza metodi o set esplicitiget.

Per ulteriori informazioni, vedi Proprietà.

Raccolte di Windows Runtime in C++/CX

Windows Runtime definisce un set di interfacce per i tipi di raccolta implementati da ogni linguaggio in modo personalizzato. C++/CX fornisce implementazioni nella Platform::Collections::Vector classe, Platform::Collections::Map nella classe e in altri tipi di raccolta concreti correlati, compatibili con le controparti della libreria standard C++.

Per altre informazioni, vedere Raccolte.

Tipi di modello ref class

private e internal i tipi di accesso ref class possono essere modelli e specializzati.

Per ulteriori informazioni, vedi Classi di riferimento del modello.

Interfacce

Un'interfaccia di Windows Runtime definisce un set di proprietà, metodi ed eventi pubblici che un ref class tipo o ref struct deve implementare se eredita dall'interfaccia .

Per altre informazioni, vedere Interfacce.

Enumerazioni

Un enum class tipo in Windows Runtime è simile a un ambito in enum C++. Il tipo sottostante è int32, a meno che non venga applicato l'attributo [Flags]. In tal caso, il tipo sottostante è uint32.

Per ulteriori informazioni, vedi Enumerazioni.

Delegati

Un delegato in Windows Runtime è analogo a un std::function oggetto in C++. Si tratta di un tipo speciale ref class usato per richiamare le funzioni fornite dal client con firme compatibili. I delegati vengono usati più comunemente in Windows Runtime come tipo di evento.

Per ulteriori informazioni, vedi Delegati.

Eccezioni

In C++/CX è possibile intercettare tipi di eccezione, std::exception tipi e Platform::Exception tipi personalizzati.

Per ulteriori informazioni, vedi Eccezioni.

evento

Un evento è un membro pubblico in un ref class oggetto o ref struct il cui tipo è un tipo delegato. Un evento può essere richiamato, ovvero generato, dalla classe proprietaria. Tuttavia, il codice client può fornire le proprie funzioni del gestore eventi, che vengono richiamate quando la classe proprietaria genera l'evento.

Per altre informazioni, vedere Events.

Cast

C++/CX supporta gli operatori static_castcast C++ standard , dynamic_caste reinterpret_caste anche l'operatore safe_cast specifico di C++/CX.

Per ulteriori informazioni, vedi Cast.

Boxing

Una variabile boxed è un tipo valore di cui viene eseguito il wrapping in un tipo riferimento. Usare le variabili boxed nelle situazioni in cui è necessaria la semantica di riferimento.

Per ulteriori informazioni, vedi Boxing.

Attributi

Un attributo è un valore di metadati che può essere applicato a qualsiasi tipo o membro del tipo di Windows Runtime. Gli attributi possono essere controllati in fase di esecuzione. Windows Runtime definisce un set di attributi comuni nello spazio dei Windows::Foundation::Metadata nomi. Gli attributi definiti dall'utente nelle interfacce pubbliche non sono supportati da Windows Runtime in questa versione.

Deprecazione dell'API

È possibile contrassegnare le API pubbliche come deprecate usando lo stesso attributo usato dai tipi di sistema Windows Runtime.

Per altre informazioni, vedere Deprecazione di tipi e membri.

Vedi anche

Riferimenti al linguaggio C++/CX