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 ++?


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.


+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.


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.


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.


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 .


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.