.NET çerçevesiyle C ++ kullanmak mümkün müdür?


18

GUI programlama hakkında C # ve C ++ 'da birçok yorum okudum. Ve Microsoft'un .NET çerçevesinin GUI programlama için güçlü olduğunu fark ettim. Peki C ++ ve .NET framework kullanmak mümkün mü?

C ++ güçlü bir dil olduğu için harika bir kombinasyon olacağını düşünüyorum ve okuduğum gibi Windows'ta GUI programlama için .NET framework tercih ediliyor. GUI'yi C # 'a ve işlevselliği C ++' a yazmak mümkün mü?


7
C # da çok güçlü bir dildir.
Adam Crossland

2
@Ramhound: C ++ / CLI'nin C # kadar güçlü olduğu doğru değil. C ++ / CLI kodu, C ++ derleyicisinin tüm optimizasyonlarını içerir ve daha hızlı çalışabilir ve yine de C #'da olmayan birçok metaprogramlama ve önişlemci tekniği içerir.
DeadMG

2
Ayrıca, biri C ++ iyi ise C # almak için herhangi bir zorluk olmamalıdır. Söylemiyorum ama söylüyorum.
Rig

4
C ++ bildiğinizi düşünürsek, C ++ / CLI veya C # öğrenmek arasında bir seçeneğiniz olacaktır. Gerçek C ++ da değildir. C ++ / CLI ile çalışmak yerine C # öğrenmenizi öneririm; C ++ / CLI hiçbir yerde ana dil değildir, bu nedenle C # için çok sayıda kitap ve destek bulacaksınız.
David Thornley

6
@ddacot hayır, C ++ değil demek hiç oyun geliştirme için. Diğer tüm programlama dilleri gibi, yazılım geliştirme içindir. Oyunlar sadece bir çeşit yazılımdır.
MattDavey

Yanıtlar:


21

Evet, daha önce Managed C ++ ve şimdi C ++ / CLI olarak biliniyordu . NET Framework'ün (GUI: WinForms, GDI +, vb.) Tümüne, birlikte verilen diğer yönetilen üç dil olan C #, F # ve VB.NET'ten erişebilirsiniz.


+1 Jesse'nin cevabına. Yanılmıyorsam, C ++ / CLI çoklu kalıtım desteklemiyor. Bu nedenle, bazı beklenmedik özelliklere hazırlıklı olun. Bu özelliklerin bazıları CLI sınırlamalarından geldi. Kullanmaya başlamadan önce C ++ / CLI ve 'klasik' C ++ arasındaki farkı bulmaya çalışmanızı öneririm.
Igor Soloydenko

Bu, ilk linkte biraz ayrıntılı olarak belirtilmiştir. Böylece özet: "C ++ zaman içinde çok gelişti ve dilde yazılmış çoğu yazılım nesne yönelimlidir. Yönetilen C ++ ve sınıflar ve sınıf tabanlı nesnelerin kullanımı Visual C ++ gibi yaygın kalır. Yönetilen C ++ bu tek büyük değişiklik çoklu kalıtımın yeteneklerinin desteklenmemesidir. Bunun nedeni CLR'nin bir sınırlamasıdır. CLR'nin çöp toplayıcısında yönetilen bir sınıf birden fazla sınıfı devralamaz. "
Jesse C. Slicer

Bu iyi. Aslında, C ++ 'da iyi değilim. Sadece sorun yaratabilecek başka önemli farklılıklar olabileceğini düşündüm.
Igor Soloydenko

Geçen sefer biraz C ++ yazdım geçen yüzyılda bir zamanlar oldu :)
Jesse C. Slicer

1
@keykeeper, tipik bir C ++ / CLI kullanımı, yönetilmeyen bir C ++ kütüphanesi ve yönetilen dünya arasında ince bir köprü olmaktır. Böyle bir kullanım için yeterlidir. Tabii ki içinde önemli bir şeyi kodlamak mantıklı değil.
SK-logic

7

Unix dünyası için tipik olan en esnek ve basit seçeneği unutmayın, ancak bir nedenden ötürü, Windows'da yaygın değildir: GUI ve mantığı farklı süreçlere bölmek, makul bir RPC formu (örneğin, bir boru bile iş). Tercihen basit, insan tarafından okunabilen bir metin protokolü ile.

Bu şekilde GUI'yi (veya çeşitli GUI'leri) istediğiniz herhangi bir teknolojiyle uygulayabilir ve ihtiyaca daha uygun olan mantık bileşenlerini (C ++, komut dosyaları, başka herhangi bir şey) oluşturabilirsiniz.

Ben farkında değilim herhangi , Windows dünyadan bir monolitik bir tasarım yaklaşımının makul avantajları.


4

Bunu birkaç yıl önce Managed C ++ günlerinde yaptım. Biz C # ile yazılmış bir sihirbaz tarzı GUI içine dahil etmek istediğim bir hasarlı DLL içinde bazı iş mantığı vardı. Bunu yapmak için, yönetilen GUI uygulaması ve yönetilmeyen DLL arasında oturmak için bir Yönetilen C ++ derlemesi oluşturdum ve değerleri bu tür içinde yönetilen türlerden (System :: Int32) yönetilmeyen biçime dönüştürmek için System :: Runtime :: InteropServices :: Marshal kullandım türleri (int) ve tersi.

Yönetilen C ++ kullanımdan kaldırılmış gibi görünse de, aynı prensip C ++ / CLI için de geçerli olabilir.


3

Pek sayılmaz. Karma bir C ++ / CLI dili vardır, ancak yalnızca birlikte çalışma için iyidir (Microsoft'un resmi politikası). .NET çerçevesinin tasarlanma şekli nedeniyle, CLR'de çalışmaya gerçekten uymayan birçok dil semantiği vardır ve C ++ bunların çoğunu sergiler.


7
Bu ifadeye katılmıyorum. C ++ / CLI birçok uygulama için mükemmel şekilde uygundur.
Ramhound

3
@Ramhound: Microsoft'un kendisi yalnızca birlikte çalışabilmesi için öneriyor. Bu onların resmi politikası.
DeadMG

2
@DeadMG bunun için bir kaynak sağlayabilir misiniz?
sq33G

1
@DeadMG, yanılıyorsun. .NET GUI'yi yerel bir mantıkla çalıştırmanın birçok seçeneği vardır.
SK-logic

2
@DeadMG - Microsoft'un resmi politikasının (bir dakika için buna inanmıyorum) olduğunu kanıtlayan sürece FUD
Ramhound 15:12

3

C ++ / CLI açısı şimdiye kadar pek çok yanıtla karşılandı, ancak bunu yapmanın başka bir yolu da PInvoke kullanmaktır. Bu, C # programlarının C ++ ile yazılmış dll'lerde bulunan işlevleri çağırmasını sağlar. PInvoke'un avantajı, dll'nizin .Net'den çağrılacağı gerçeği hakkında tamamen agnostik olmasıdır. Bu, kaynak kodu olmayan dll'leri çağırabileceğiniz anlamına gelir ve kaynak kodunu yapmış olsanız bile / clr seçeneğini kullanarak yeniden derlemek zorunda kalmazsınız. Bu, bu dll C # programları yanı sıra diğer C ++ programları ile kullanabileceğiniz anlamına gelir. Orada bazı harika C / C ++ kütüphaneleri var: PInvoke bunlardan yararlanmanızı sağlar. Bazen Win32 kitaplıkları .Net'te bulunmayan işlevler sağlar: PInvoke bunları kullanmanızı sağlar.

PInvoke kullanmanın en zor kısımlarından biri, yönetilmeyen imzanın yönetilen imzayı nasıl dönüştüreceğini bilmek. Ama buna yardımcı olacak bir hile sayfası var.


Ancak P / Invoke C ++ doğrudan olduğunda, mangling olduğunun farkında olun veya daha iyi bir C sarıcı sağlayın.
SK-logic

0

COM (Bileşen Nesne Modeli) aracılığıyla bir C # dereotu ile de çalışabilirsiniz. Benim için COM, Visual Studio 2010, Yönetilen C ++ için intellisense olmadığı için daha sonra Managed C ++ kullanarak daha iyiydi. Benim durumumda zaten büyük bir C ++ uygulamamız var, ancak MFC'den WinForms veya WPF'ye geçmek istedim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.