Apa itu C ++ / CX dan C ++ / CLI, dan bagaimana hubungannya dengan C ++ dan WinRT?

31

Saya sedang mempertimbangkan mengambil tantangan mempelajari C ++ untuk mendesain aplikasi Metro dan saat itulah saya menemukan C ++ / CX.

Bisakah aplikasi Metro dikodekan dalam C ++ 11? Apakah mereka membutuhkan C ++ / CX untuk bekerja? Dan apa sebenarnya C ++ / CX? Apakah mungkin membuat aplikasi Metro hanya menggunakan C ++, atau apakah C ++ / CX diperlukan? Juga, bagaimana C ++ / CLI mengikat gambar ini?

Ein Doofus
sumber
Juga penggunaan C ++ / CX tidak disarankan sekarang (C ++ / WinRT lebih disukai), lihat dokumen
SWdV

Jawaban:

28

Microsoft dulu hanya membuat sistem C ++ yang memungkinkan Anda mengakses Windows API mereka (disebut win32), lalu suatu hari mereka menemukan .NET dan menganggap semuanya harus diubah.

Jadi mereka menciptakan "Ekstensi Terkelola untuk C ++" yang pada dasarnya adalah C ++ tetapi dengan beban ekstensi non-standar, menambahkan kata kunci ingin __gcmendukung fitur .NET (seperti mengalokasikan pada tumpukan GC daripada yang asli)

Tetapi orang-orang tidak menyukai ini karena sebenarnya bukan C ++, memiliki semua kata kunci tambahan, jadi Microsoft mendesain ulang dan menyebutnya C ++ / CLI, yang memiliki kumpulan kata kunci tambahan yang jauh lebih kecil tetapi memperkenalkan perubahan sintaksis seperti ^(yang merupakan referensi 'pointer' ke objek .NET pada heap GC).

Beberapa tahun kemudian dan Microsoft menyadari .NET bukanlah peluru perak seperti yang mereka katakan, dan mereka juga menggabungkan Windows dan tim Pengembang yang sedang bertarung. Bagian dari evaluasi ulang ini mengarah pada pembuatan API Windows baru, yang disebut WinRT, yang sepenuhnya merupakan kode asli dan ini berarti ekstensi lama tidak lagi berguna, jadi Microsoft mengembangkan ekstensi C ++ mereka ke yang membuat bekerja dengan yang baru WinRT API lebih mudah - dengan menjaga beberapa ekstensi dari C ++ / CLI (seperti ^).

Jadi - begitulah, 3 versi berbeda dari C ++ diperpanjang yang dangkal C ++. Setidaknya versi terbaru adalah kode asli lagi, jadi Anda tidak perlu menggunakan ekstensi jika Anda tidak mau karena Anda dapat langsung mengakses API (itu disebut WRL dan sangat mirip dengan kelas template ATL lama)

Jika Anda berpikir Anda mungkin sedang mengkode kode lintas-platform yang tidak Anda inginkan - Anda dapat mengubah panggilan API, tetapi Anda tidak dapat menggunakan ^pada kompiler apa pun selain Visual C ++. Saya akan merekomendasikan menggunakan API WRL dan menjaga kode Anda sebagai standar mungkin mengingat 'kode tambahan' yang Anda butuhkan untuk menulis dibandingkan dengan C ++ / CX tidak terlalu bagus.

gbjbaanb
sumber
Catatan: C ++ / CX tidak disebutkan sampai akhir; alangkah baiknya untuk secara eksplisit mengatakan mana yang ada di paragrafnya.
Acorn
11

Mengutip http://blogs.msdn.com/b/vcblog/archive/2012/08/29/cxxcxpart00anintroduction.aspx :

. . . sementara C ++ / CX secara sintaksis mirip dengan C ++ / CLI dan dengan demikian terlihat hampir sama dalam banyak hal, secara semantik sangat berbeda. Kode C ++ / CX adalah kode asli, tidak perlu CLR. Pemrograman dalam C ++ / CLI bisa sangat menantang, karena seseorang harus dengan cekatan menyulap dua model objek yang sangat berbeda secara bersamaan: model objek C ++ dengan daya tahan objek deterministiknya, dan model objek CLI yang dikumpulkan dari sampah. C ++ / CX jauh lebih mudah untuk dikerjakan, karena Windows Runtime, yang didasarkan pada COM, memetakan dengan sangat baik ke bahasa pemrograman C ++.

Windows Runtime mendefinisikan Application Binary Interface (ABI) yang relatif sederhana dan tingkat rendah, dan mengamanatkan bahwa komponen mendefinisikan tipe mereka menggunakan format metadata umum. C ++ / CX tidak sepenuhnya diperlukan untuk menulis komponen Windows Runtime asli: sangat mungkin untuk menulis komponen Windows Runtime menggunakan C ++ tanpa menggunakan ekstensi bahasa C ++ / CX, dan Visual C ++ 2012 termasuk perpustakaan, Perpustakaan Template Windows Runtime C ++ ( WRL), untuk membantu mempermudah ini. Banyak komponen Windows Runtime yang dikirimkan sebagai bagian dari Windows (dalam namespace Windows) ditulis menggunakan WRL. Tidak ada keajaiban dalam C ++ / CX: itu hanya membuat menulis komponen Windows Runtime di C ++ jauh, lebih sederhana dan membantu untuk mengurangi jumlah kode berulang dan verbose yang harus Anda tulis ketika menggunakan solusi berbasis perpustakaan seperti WRL.

Mat
sumber