Apakah mungkin untuk menggunakan C ++ dengan framework .NET?

18

Saya telah membaca banyak komentar tentang pemrograman GUI, di keduanya, C # dan C ++. Dan saya perhatikan bahwa Microsoft .NET framework kuat untuk pemrograman GUI. Jadi apakah mungkin untuk menggunakan C ++ dan .NET framework?

Saya pikir ini akan menjadi kombinasi yang hebat karena C ++ adalah bahasa yang kuat, dan .NET framework lebih disukai untuk pemrograman GUI di Windows, seperti yang saya baca. Apakah mungkin untuk menulis GUI dalam C # dan fungsionalitas dalam C ++?

ddacot
sumber
7
C # juga merupakan bahasa yang sangat kuat.
Adam Crossland
2
@Ramhound: Sama sekali tidak benar bahwa C ++ / CLI sekuat C #. Kode C ++ / CLI berisi semua optimisasi dari kompiler C ++ dan dapat mengeksekusi lebih cepat, dan masih mengandung banyak metaprogramming dan teknik preprocessor yang tidak ada dalam C #.
DeadMG
2
Plus, seharusnya tidak ada tantangan untuk mengambil C # jika ada yang bagus di C ++. Saya tidak mengatakan tetapi saya katakan.
Rig
4
Karena Anda tahu C ++, Anda akan memiliki pilihan antara belajar C ++ / CLI atau C #. Tidak juga C ++ yang sebenarnya. Saya menyarankan belajar C # daripada mencoba bekerja dengan C ++ / CLI; C ++ / CLI bukan bahasa asli di mana pun, jadi Anda akan menemukan banyak buku dan dukungan untuk C #.
David Thornley
6
@dacot no, C ++ tidak dimaksudkan untuk pengembangan game sama sekali. Ini dimaksudkan untuk pengembangan perangkat lunak, seperti semua bahasa pemrograman lainnya. Game kebetulan menjadi salah satu jenis perangkat lunak.
MattDavey

Jawaban:

21

Ya, sebelumnya dikenal sebagai Managed C ++ dan sekarang C ++ / CLI . Anda memiliki akses ke keseluruhan .NET Framework (GUI: WinForms, GDI +, dll.) Seperti dari tiga bahasa terkelola lainnya, C #, F #, dan VB.NET.

Jesse C. Slicer
sumber
+1 Untuk jawaban Jesse. Jika saya tidak salah, C ++ / CLI tidak mendukung multiple inheritance. Jadi, bersiaplah untuk beberapa fitur yang tidak terduga. Beberapa fitur ini berasal dari keterbatasan CLI. Saya sarankan Anda mencoba mencari perbedaan antara C ++ / CLI dan 'klasik' C ++ sebelum Anda mulai menggunakannya.
Igor Soloydenko
Ini disebutkan secara rinci di tautan pertama. Ringkasannya adalah sebagai berikut: "C ++ telah berevolusi jauh dari waktu ke waktu dan sebagian besar perangkat lunak yang ditulis dalam bahasa berorientasi objek. Dikelola C ++ dan penggunaan kelas dan objek berbasis kelas tetap lazim seperti dalam Visual C ++. Satu-satunya perubahan besar untuk ini dalam Dikelola C ++ adalah bahwa kemampuan multiple inheritance tidak didukung. Ini karena keterbatasan CLR. Kelas yang dikelola di bawah pengumpul sampah CLR tidak dapat mewarisi lebih dari satu kelas. "
Jesse C. Slicer
Tidak apa-apa. Sebenarnya, saya tidak pandai C ++. Saya hanya berpikir bahwa ada perbedaan penting lainnya yang dapat membuat masalah.
Igor Soloydenko
Terakhir kali saya menulis beberapa C ++ secara harfiah sekitar abad terakhir :)
Jesse C. Slicer
1
@keykeeper, penggunaan khas C ++ / CLI adalah menjadi jembatan tipis antara pustaka C ++ yang tidak dikelola dan dunia terkelola. Cukup untuk penggunaan semacam itu. Tentu saja tidak masuk akal untuk mengkode sesuatu yang cukup besar di dalamnya.
SK-logic
6

Jangan lupa tentang opsi yang paling fleksibel dan sederhana, tipikal untuk dunia Unix tetapi, untuk beberapa alasan, tidak umum di Windows: memecah GUI dan logika menjadi proses yang berbeda, berkomunikasi melalui bentuk RPC yang wajar (misalnya, bahkan sebuah pipa harus kerja). Lebih disukai dengan protokol teks sederhana yang dapat dibaca manusia.

Dengan cara ini Anda dapat mengimplementasikan GUI Anda (atau berbagai GUI) dengan teknologi apa pun yang Anda suka, dan membangun komponen logika dari apa pun yang sesuai dengan kebutuhan dengan lebih baik - C ++, skrip, apa pun yang lainnya.

Saya tidak mengetahui adanya keuntungan wajar dari pendekatan desain monolitik dari dunia Windows.

Logika SK
sumber
4

Saya melakukan ini sekali beberapa tahun yang lalu, kembali pada hari-hari Managed C ++. Kami memiliki beberapa logika bisnis dalam DLL umanaged yang ingin kami gabungkan ke dalam GUI gaya penyihir yang ditulis dalam C #. Untuk melakukan ini, saya membuat rakitan C ++ yang Dikelola untuk duduk di antara aplikasi GUI yang dikelola dan DLL yang tidak dikelola dan menggunakan System :: Runtime :: InteropServices :: Marshal di dalam rakitan itu untuk mengonversi nilai dari jenis yang dikelola (System :: Int32) menjadi tidak terkelola jenis (int) dan sebaliknya.

Meskipun Managed C ++ tampaknya sudah tidak digunakan lagi, prinsipal yang sama mungkin berlaku untuk C ++ / CLI.

Raymond Saltrelli
sumber
3

Tidak juga. Ada bahasa hibrida C ++ / CLI, tetapi itu hanya baik untuk interoperation (kebijakan resmi Microsoft). Karena cara kerangka NET dirancang, ada banyak semantik bahasa yang benar-benar tidak cocok berjalan di CLR, dan C ++ menunjukkan banyak dari mereka.

DeadMG
sumber
7
Saya tidak setuju dengan pernyataan ini. C ++ / CLI sangat cocok untuk banyak implementasi.
Ramhound
3
@Ramhound: Microsoft sendiri hanya merekomendasikannya untuk interoperasi. Itu kebijakan resmi mereka.
DeadMG
2
@DeadMG dapatkah Anda memberikan sumber untuk itu?
sq33G
1
@DeadMG, Anda salah. Ada begitu banyak opsi untuk menjalankan .NET GUI dengan logika asli.
SK-logic
2
@DeadMG - Kecuali Anda memberikan bukti bahwa itu adalah kebijakan resmi Microsoft (saya tidak percaya itu sebentar) maka Anda baru saja melewati FUD
Ramhound
3

Sudut C ++ / CLI telah dicakup oleh banyak jawaban sejauh ini, tetapi cara lain untuk melakukan ini adalah dengan menggunakan PInvoke. Ini memungkinkan program C # untuk memanggil fungsi yang terdapat dalam dll yang ditulis dalam C ++. Keuntungan dari PInvoke adalah bahwa dll Anda benar-benar agnostik tentang fakta bahwa ia akan dipanggil dari .Net. Ini berarti Anda dapat memanggil dll yang Anda tidak memiliki kode sumber, dan bahkan jika Anda melakukannya Anda kode sumber Anda tidak perlu mengkompilasi ulang menggunakan opsi / clr. Ini berarti Anda dapat menggunakan dll ini dengan program C ++ lainnya, serta program C #. Ada beberapa pustaka C / C ++ yang luar biasa di luar sana: PInvoke memungkinkan Anda memanfaatkannya. Terkadang pustaka Win32 menyediakan fungsi yang tidak tersedia di .Net: PInvoke memungkinkan Anda untuk menggunakannya.

Salah satu bagian tersulit dalam menggunakan PInvoke adalah mengetahui cara mengubah tanda tangan yang tidak dikelola menjadi tanda tangan yang dikelola. Tapi ada lembar contekan untuk membantu itu.

Phillip Ngan
sumber
Tetapi ketika P / Meminta C ++ secara langsung, waspadai mangling, atau lebih baik berikan bungkus C tipis di antaranya.
SK-logic
0

Anda juga dapat bekerja dengan C # dill melalui COM (Component Object Model). Bagi saya, COM lebih baik daripada menggunakan Managed C ++ karena Visual Studio 2010 tidak memiliki intellisense untuk Managed C ++. Dalam kasus saya, kami sudah memiliki aplikasi C ++ besar tetapi ingin mencoba pindah dari MFC ke WinForms atau WPF.

Travis
sumber