Czy można używać C ++ w środowisku .NET?

18

Czytałem wiele komentarzy na temat programowania GUI, zarówno w języku C #, jak i C ++. Zauważyłem, że platforma .NET firmy Microsoft jest potężna do programowania GUI. Czy można więc korzystać z frameworka C ++ i .NET?

Myślę, że będzie to świetna kombinacja, ponieważ C ++ jest potężnym językiem, a .NET jest preferowany do programowania GUI w systemie Windows, jak czytałem. Czy można napisać GUI w C # i funkcjonalność w C ++?

ddacot
źródło
7
C # jest również bardzo potężnym językiem.
Adam Crossland
2
@Ramhound: To nieprawda, że ​​C ++ / CLI jest tak potężny jak C #. Kod C ++ / CLI zawiera wszystkie optymalizacje z kompilatora C ++ i może być wykonywany szybciej, a ponadto zawiera wiele technik metaprogramowania i preprocesora, które nie są w języku C #.
DeadMG
2
Plus, nie powinno być żadnym wyzwaniem, aby wybrać C #, jeśli ktoś jest dobry w C ++. Nie mówię, ale mówię.
Przypon
4
Biorąc pod uwagę, że znasz C ++, będziesz miał wybór pomiędzy nauką C ++ / CLI lub C #. Nie jest to także rzeczywisty C ++. Proponuję nauczyć się języka C # zamiast próbować pracować z C ++ / CLI; C ++ / CLI nie jest natywnym językiem, więc znajdziesz wiele książek i wsparcie dla C #.
David Thornley,
6
@ddacot nie, C ++ w ogóle nie jest przeznaczony do tworzenia gier. Jest przeznaczony do tworzenia oprogramowania, podobnie jak wszystkie inne języki programowania. Gry to tylko jeden rodzaj oprogramowania.
MattDavey,

Odpowiedzi:

21

Tak, wcześniej był znany jako Managed C ++, a teraz C ++ / CLI . Masz dostęp do całości .NET Framework (GUI: WinForms, GDI + itp.), Tak jak w przypadku pozostałych trzech dołączonych zarządzanych języków, C #, F # i VB.NET.

Jesse C. Slicer
źródło
+1 do odpowiedzi Jessego. Jeśli się nie mylę, C ++ / CLI nie obsługuje wielokrotnego dziedziczenia. Przygotuj się na nieoczekiwane funkcje. Niektóre z tych funkcji pochodzą z ograniczeń interfejsu CLI. Polecam spróbować znaleźć różnicę między C ++ / CLI a „klasycznym” C ++, zanim zaczniesz go używać.
Igor Soloydenko
Zostało to szczegółowo wspomniane w pierwszym łączu. Podsumowanie jest zatem następujące: „C ++ ewoluowało z biegiem czasu, a większość oprogramowania napisanego w tym języku jest zorientowana obiektowo. Zarządzane C ++ oraz wykorzystanie klas i obiektów opartych na klasach pozostaje powszechne, tak jak w Visual C ++. Jedyna istotna zmiana w Managed C ++ polega na tym, że możliwości wielokrotnego dziedziczenia nie są obsługiwane. Wynika to z ograniczenia CLR. Klasa zarządzana w ramach śmieciarza CLR nie może dziedziczyć więcej niż jednej klasy. ”
Jesse C. Slicer
W porządku. Właściwie nie jestem dobry w C ++. Pomyślałem, że mogą istnieć inne ważne różnice, które mogą powodować problemy.
Igor Soloydenko
Ostatnim razem, gdy napisałem trochę C ++, było dosłownie w ostatnim stuleciu :)
Jesse C. Slicer
1
@keykeeper, typowym zastosowaniem C ++ / CLI jest cienki pomost między niezarządzaną biblioteką C ++ a zarządzanym światem. To wystarczy do takiego zastosowania. Oczywiście nie ma sensu kodować w nim czegoś sporego.
SK-logic
6

Nie zapomnij o najbardziej elastycznej i najprostszej opcji, typowej dla świata uniksowego, ale z jakiegoś powodu nie tak powszechnej w systemie Windows: dzielenie GUI i logiki na różne procesy, komunikowanie się za pomocą dowolnej rozsądnej formy RPC (np. Nawet potok powinien praca). Najlepiej z prostym, czytelnym dla człowieka protokołem tekstowym.

W ten sposób możesz zaimplementować GUI (lub różne GUI) z dowolnymi technologiami, które ci się podobają, i zbudować elementy logiczne z tego, co bardziej odpowiada potrzebom - C ++, skrypty, cokolwiek innego.

Nie znam żadnych rozsądnych zalet monolitycznego podejścia do projektowania ze świata Windows.

Logika SK
źródło
4

Zrobiłem to raz kilka lat temu, w czasach Managed C ++. Mieliśmy trochę logiki biznesowej w zarządzanej bibliotece DLL, którą chcieliśmy włączyć do GUI w stylu kreatora napisanego w C #. Aby to zrobić, utworzyłem zestaw Managed C ++, który znajduje się między zarządzaną aplikacją GUI a niezarządzaną biblioteką DLL, i użyłem System :: Runtime :: InteropServices :: Marshal w tym zestawie do konwersji wartości z typów zarządzanych (System :: Int32) na niezarządzane typy (int) i odwrotnie.

Chociaż Managed C ++ wydaje się być przestarzały, ta sama zasada może mieć zastosowanie do C ++ / CLI.

Raymond Saltrelli
źródło
3

Nie całkiem. Istnieje język hybrydowy C ++ / CLI, ale nadaje się tylko do współpracy (oficjalna polityka Microsoftu). Ze względu na sposób zaprojektowania frameworku .NET istnieje wiele semantyki języka, która naprawdę nie pasuje do uruchamiania w CLR, a C ++ wykazuje wiele z nich.

DeadMG
źródło
7
Nie zgadzam się z tym stwierdzeniem. C ++ / CLI doskonale nadaje się do wielu wdrożeń.
Ramhound
3
@Ramhound: sami Microsoft polecają go tylko do współpracy. To jest ich oficjalna polityka.
DeadMG
2
@DeadMG czy możesz podać źródło?
sq33G
1
@DeadMG, mylisz się. Istnieje wiele opcji uruchamiania GUI .NET z logiką natywną.
SK-logic
2
@DeadMG - Chyba że dostarczysz dowód, że taka jest oficjalna polityka Microsoftu (nie wierzę, że przez chwilę), to po prostu przekazujesz FUD
Ramhound
3

Do tej pory kąt C ++ / CLI był objęty wieloma odpowiedziami, ale innym sposobem jest użycie PInvoke. Pozwala to programom C # wywoływać funkcje zawarte w bibliotekach DLL napisanych w C ++. Zaletą PInvoke jest to, że twoja biblioteka DLL jest całkowicie agnostyczna wobec faktu, że zostanie wywołana z .Net. Oznacza to, że możesz wywoływać biblioteki DLL, dla których nie masz kodu źródłowego, a nawet jeśli zrobiłeś kod źródłowy, nie musiałbyś go ponownie kompilować za pomocą opcji / clr. Oznacza to, że możesz używać tej biblioteki DLL z innymi programami C ++, a także programami C #. Istnieje kilka fantastycznych bibliotek C / C ++: PInvoke pozwala ci z nich skorzystać. Czasami biblioteki Win32 zapewniają funkcje, które po prostu nie są dostępne w .Net: PInvoke pozwala z nich korzystać.

Jedną z najtrudniejszych części korzystania z PInvoke jest umiejętność konwersji niezarządzanego podpisu na podpis zarządzany. Ale jest do tego cheatheet .

Phillip Ngan
źródło
Ale kiedy P / Invoking C ++ bezpośrednio, bądź świadomy manglingu, albo lepiej zapewnij cienkie otokowanie C pomiędzy nimi.
SK-logic
0

Możesz również pracować z koperkiem C # za pomocą COM (Component Object Model). Dla mnie COM był lepszy niż używanie Managed C ++, ponieważ Visual Studio 2010 nie ma inteligencji dla Managed C ++. W moim przypadku mamy już dużą aplikację C ++, ale chcieliśmy spróbować przejść z MFC do WinForms lub WPF.

Travis
źródło