Gambaran umum sistem jenis (C++/CX)

Dengan menggunakan arsitektur Windows Runtime, Anda dapat menggunakan C++/WinRT, C++/CX, Visual Basic, Visual C#, dan JavaScript untuk menulis aplikasi dan komponen. Mereka dapat langsung mengakses Windows API dan beroperasi dengan aplikasi dan komponen Windows Runtime lainnya. aplikasi Platform Windows Universal (UWP) yang ditulis dalam C++ dikompilasi ke kode asli yang dijalankan langsung di CPU. Aplikasi UWP yang ditulis dalam C# atau Visual Basic dikompilasi ke bahasa perantara Microsoft (MSIL) dan dijalankan dalam runtime bahasa umum (CLR). Aplikasi UWP yang ditulis dalam JavaScript dijalankan di lingkungan run-time JavaScript. Komponen sistem operasi Windows Runtime sendiri ditulis dalam C++ dan dijalankan sebagai kode asli. Semua komponen dan aplikasi UWP ini berkomunikasi langsung melalui antarmuka biner aplikasi Windows Runtime (ABI).

Untuk mengaktifkan dukungan untuk Windows Runtime di idiom C++ modern, Microsoft membuat ekstensi bahasa C++/CX. C++/CX menyediakan jenis dasar bawaan dan implementasi jenis Windows Runtime dasar. Jenis ini memungkinkan aplikasi dan komponen C++ berkomunikasi di seluruh ABI dengan aplikasi yang ditulis dalam bahasa lain. Aplikasi C++/CX dapat menggunakan jenis Windows Runtime apa pun. Mereka juga dapat membuat kelas, struktur, antarmuka, dan jenis lain yang ditentukan pengguna yang dapat digunakan aplikasi dan komponen UWP lainnya. Aplikasi UWP yang ditulis dalam C++/CX juga dapat menggunakan kelas dan struktur C++ reguler, selama mereka tidak memiliki aksesibilitas publik.

Untuk diskusi mendalam tentang proyeksi bahasa C++/CX dan cara kerjanya di bawah sampul, lihat posting blog ini:

Catatan

Meskipun C++/CX masih didukung, kami sarankan Anda menggunakan C++/WinRT untuk aplikasi dan komponen Windows Runtime baru sebagai gantinya. Ini dirancang untuk memberi Anda akses kelas satu ke Windows API modern. Terlepas dari namanya, C++/WinRT hanya menggunakan C++17 standar tanpa ekstensi. Ini menggunakan pustaka khusus header untuk mengimplementasikan proyeksi bahasa C++ untuk API Runtime Windows. C++/WinRT tersedia di Windows SDK dari versi 1803 (10.0.17134.0) dan seterusnya.

File metadata Windows (.winmd)

Saat Anda mengkompilasi aplikasi UWP yang ditulis dalam C++, pengkompilasi menghasilkan yang dapat dieksekusi dalam kode mesin asli, dan juga menghasilkan file metadata Windows (.winmd) terpisah yang berisi deskripsi jenis Windows Runtime publik, yang mencakup kelas, struktur, enumerasi, antarmuka, antarmuka parameter, dan delegasi. Format metadata menyerupai format yang digunakan dalam rakitan .NET Framework. Dalam komponen C++, .winmd file hanya berisi metadata; kode yang dapat dieksekusi berada dalam file terpisah. Komponen Windows Runtime yang disertakan dengan Windows menggunakan pengaturan ini. .winmd Nama file harus cocok atau merupakan awalan namespace layanan akar dalam kode sumber. (Untuk bahasa .NET Framework, .winmd file berisi kode dan metadata, sama seperti rakitan .NET Framework.)

Metadata dalam .winmd file mewakili permukaan kode Anda yang diterbitkan. Jenis yang dipublikasikan dapat dilihat oleh aplikasi UWP lainnya terlepas dari bahasa apa yang ditulis aplikasi lain tersebut. Metadata, atau kode yang Anda terbitkan, hanya dapat berisi jenis yang ditentukan oleh sistem jenis Windows Runtime. Anda tidak dapat menerbitkan konstruksi bahasa khusus C++seperti kelas reguler, array, templat, atau kontainer Pustaka Standar (STL) C++. Aplikasi klien JavaScript atau C# tidak akan tahu apa yang harus dilakukan dengan mereka.

Apakah jenis atau metode terlihat dalam metadata tergantung pada pengubah aksesibilitas apa yang diterapkan padanya. Agar terlihat, jenis harus dideklarasikan dalam namespace dan harus dinyatakan sebagai public. Non-diizinkanpublicref class sebagai jenis pembantu internal dalam kode Anda; itu hanya tidak terlihat dalam metadata. Bahkan dalam public ref class, tidak semua anggota selalu terlihat. Tabel berikut mencantumkan hubungan antara penentu akses C++ dalam public ref classvisibilitas metadata Windows Runtime , dan :

Diterbitkan dalam metadata Tidak diterbitkan dalam metadata
public private
protected internal
public protected private protected

Anda dapat menggunakan Browser Objek untuk melihat konten .winmd file. Komponen Windows Runtime yang disertakan dengan Windows ditemukan dalam Windows.winmd file. File default.winmd berisi jenis dasar yang digunakan dalam C++/CX, dan platform.winmd berisi jenis dari Platform namespace. Secara default, ketiga .winmd file ini disertakan dalam setiap proyek C++ untuk aplikasi UWP.

Tip

Jenis di Platform::Collections namespace tidak muncul dalam .winmd file karena tidak publik. Mereka adalah implementasi khusus C++privat dari antarmuka yang didefinisikan dalam Windows::Foundation::Collections. Aplikasi Windows Runtime yang ditulis dalam JavaScript atau C# tidak tahu apa Platform::Collections::Vector itu kelas , tetapi dapat menggunakan Windows::Foundation::Collections::IVector. Jenis didefinisikan Platform::Collections dalam collection.h.

Sistem jenis Windows Runtime di C++/CX

Bagian berikut menjelaskan fitur utama sistem jenis Windows Runtime dan bagaimana mereka didukung di C++/CX.

Namespace

Semua tipe Windows Runtime harus dideklarasikan dalam namespace; WINDOWS API itu sendiri diatur menurut namespace layanan. File .winmd harus memiliki nama yang sama dengan namespace layanan akar. Misalnya, kelas yang diberi nama A.B.C.MyClass hanya dapat dibuat jika ditentukan dalam file metadata yang bernama A.winmd, , A.B.winmdatau A.B.C.winmd. Nama DLL tidak diperlukan untuk mencocokkan .winmd nama file.

WINDOWS API sendiri telah ditemukan kembali sebagai pustaka kelas yang diperhitungkan dengan baik yang diatur oleh namespace. Semua komponen Windows Runtime dideklarasikan dalam Windows.* namespace.

Untuk informasi selengkapnya, lihat Namespace layanan dan mengetik visibilitas.

Jenis-jenis dasar

Windows Runtime menentukan jenis dasar berikut: UInt8, , Int16, UInt16, Int32, UInt32Int64, UInt64, Single, , Double, Char16, , Booleandan String. C++/CX mendukung jenis numerik mendasar di namespace defaultnya sebagai uint16, , , uint64uint32, int32int16, int64, float32, , float64, dan char16. Boolean dan String juga didefinisikan dalam Platform namespace layanan.

C++/CX juga mendefinisikan uint8, setara dengan unsigned char, yang tidak didukung di Windows Runtime dan tidak dapat digunakan di API publik.

Jenis dasar dapat dibuat nullable dengan membungkusnya dalam Platform::IBox antarmuka. Untuk informasi selengkapnya, lihat Kelas dan struktur nilai.

Untuk informasi selengkapnya tentang jenis dasar, lihat Jenis dasar

String

String Runtime Windows adalah urutan karakter UNICODE 16-bit yang tidak dapat diubah. String Runtime Windows diproyeksikan sebagai Platform::String^. Kelas ini menyediakan metode untuk konstruksi string, manipulasi, dan konversi ke dan dari wchar_t.

Untuk informasi selengkapnya, lihat String.

Larik

Windows Runtime mendukung array satu dimensi dari jenis apa pun. Array array tidak didukung. Di C++/CX, array Windows Runtime diproyeksikan sebagai Platform::Array kelas .

Untuk informasi lebih lanjut, lihat Array dan WriteOnlyArray.

ref class dan ref struct jenis

Kelas Windows Runtime diproyeksikan dalam C++/CX sebagai ref class atau ref struct jenis, karena disalin oleh referensi. Manajemen memori untuk ref class objek dan ref struct ditangani secara transparan melalui penghitungan referensi. Ketika referensi terakhir ke objek keluar dari cakupan, objek dihancurkan. Atau ref classref struct jenis dapat:

  • Berisi sebagai konstruktor anggota, metode, properti, dan peristiwa. Anggota ini dapat memiliki publicaksesibilitas , private, protected, atau internal .

  • Dapat berisi definisi , , structatau class berlapis enumprivat.

  • Dapat langsung mewarisi dari satu kelas dasar dan dapat mengimplementasikan sejumlah antarmuka. Semua ref class objek secara implisit dapat dikonversi ke Platform::Object kelas dan dapat mengambil alih metode virtualnya—misalnya, Object::ToString.

Konstruktor ref class publik harus dinyatakan sebagai sealed, untuk mencegah derivasi lebih lanjut.

Untuk informasi selengkapnya, lihat Kelas dan struktur Ref

value class dan value struct jenis

value class Atau value struct mewakili struktur data dasar dan hanya berisi bidang, yang mungkin jenisvalue class, value struct jenis, atau jenis Platform::String^. value struct dan value class objek disalin oleh nilai.

Dapat value struct dibuat nullable dengan membungkusnya dalam IBox antarmuka.

Untuk informasi selengkapnya, lihat Kelas dan struktur nilai.

Kelas parsial

Fitur kelas parsial memungkinkan satu kelas ditentukan melalui beberapa file. Ini memungkinkan alat pembuatan kode seperti editor XAML memodifikasi satu file tanpa menyentuh file lain yang Anda edit.

Untuk informasi selengkapnya, lihat Kelas parsial

Properti

Properti adalah anggota data publik dari jenis Windows Runtime apa pun. Ini dideklarasikan dan didefinisikan dengan menggunakan property kata kunci. Properti diimplementasikan sebagai get/set pasangan metode. Kode klien mengakses properti seolah-olah itu adalah bidang publik. Properti yang tidak memerlukan kustom get atau set kode dikenal sebagai properti sepele dan dapat dinyatakan tanpa metode atau set eksplisitget.

Untuk informasi selengkapnya, lihat Properti.

Koleksi Windows Runtime di C++/CX

Windows Runtime mendefinisikan sekumpulan antarmuka untuk jenis koleksi yang diterapkan setiap bahasa dengan caranya sendiri. C++/CX menyediakan implementasi di Platform::Collections::Vector kelas, Platform::Collections::Map kelas, dan jenis koleksi beton terkait lainnya, yang kompatibel dengan mitra Pustaka Standar C++mereka.

Untuk informasi selengkapnya, lihat Koleksi.

Jenis templat ref class

private dan internal jenis akses ref class dapat di-template dan dikhususkan.

Untuk informasi selengkapnya, lihat Kelas ref templat.

Antarmuka

Antarmuka Windows Runtime mendefinisikan sekumpulan properti publik, metode, dan peristiwa yang harus diterapkan atau ref classref struct jenis jika mewarisi dari antarmuka.

Untuk informasi lebih lanjut, lihat Antarmuka .

Enum

Jenis enum class dalam Windows Runtime menyerupan cakupan enum di C++. Jenis yang mendasar adalah int32, kecuali atribut [Bendera] diterapkan—dalam hal ini, jenis yang mendasar adalah uint32.

Untuk informasi selengkapnya, lihat Enums.

Delegasikan

Delegasi dalam Windows Runtime dianalogikan dengan std::function objek di C++. Ini adalah jenis khusus ref class yang digunakan untuk memanggil fungsi yang disediakan klien yang memiliki tanda tangan yang kompatibel. Delegasi paling umum digunakan dalam Windows Runtime sebagai jenis peristiwa.

Untuk informasi selengkapnya, lihat Delegasi.

Pengecualian

Di C++/CX, Anda dapat menangkap jenis, jenis, std::exception dan Platform::Exception jenis pengecualian kustom.

Untuk informasi selengkapnya, lihat Pengecualian.

Aktivitas

Peristiwa adalah anggota publik dalam atau ref classref struct yang jenisnya adalah jenis delegasi. Peristiwa hanya dapat dipanggil—yaitu, diaktifkan—oleh kelas pemilik. Namun, kode klien dapat menyediakan fungsi penanganan aktivitasnya sendiri, yang dipanggil ketika kelas pemilik mengaktifkan peristiwa.

Untuk informasi selengkapnya, lihat Peristiwa.

Casting

C++/CX mendukung operator static_castcast C++ standar, , dynamic_castdan reinterpret_cast, dan juga safe_cast operator yang khusus untuk C++/CX.

Untuk informasi selengkapnya, lihat Casting.

Boxing

Variabel berkotak adalah jenis nilai yang dibungkus dalam jenis referensi. Gunakan variabel kotak dalam situasi di mana semantik referensi diperlukan.

Untuk informasi selengkapnya, lihat Tinju.

Atribut

Atribut adalah nilai metadata yang dapat diterapkan ke jenis Windows Runtime atau anggota jenis apa pun. Atribut dapat diperiksa pada waktu proses. Windows Runtime mendefinisikan sekumpulan atribut umum di Windows::Foundation::Metadata namespace. Atribut yang ditentukan pengguna pada antarmuka publik tidak didukung oleh Windows Runtime dalam rilis ini.

Penghentian API

Anda dapat menandai API publik sebagai tidak digunakan lagi dengan menggunakan atribut yang sama yang digunakan oleh jenis sistem Windows Runtime.

Untuk informasi selengkapnya, lihat Jenis dan anggota yang tidak digunakan lagi.

Baca juga

Referensi bahasa C++/CX