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
. public
ref class
Non è consentito come tipo di helper interno nel codice, ma non è visibile nei metadati. Anche in , public ref class
non tutti i membri sono necessariamente visibili. La tabella seguente elenca la relazione tra gli identificatori di accesso C++ in una public ref class
visibilità 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.winmd
o 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
, Double
Single
Char16
UInt64
Boolean
e .String
C++/CX supporta i tipi numerici fondamentali nel relativo spazio dei nomi predefinito come uint16
, int32
int64
uint32
int16
float32
uint64
float64
e .char16
Boolean
e String
sono definiti anche nello spazio dei Platform
nomi .
C++/CX definisce uint8
anche , 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 class
tipi 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
,protected
ointernal
accessibilità.Può contenere definizioni ,
struct
oclass
annidateenum
private.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'overridePlatform::Object
dei relativi metodi virtuali,Object::ToString
ad 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 class
tipi 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.
Eventi
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_cast
cast C++ standard , dynamic_cast
e reinterpret_cast
e 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.