Ist es möglich, C ++ mit dem .NET-Framework zu verwenden?

18

Ich habe viele Kommentare zur GUI-Programmierung sowohl in C # als auch in C ++ gelesen. Und mir ist aufgefallen, dass das .NET-Framework von Microsoft leistungsstark für die GUI-Programmierung ist. Ist es also möglich, C ++ und .NET Framework zu verwenden?

Ich denke, es wird eine großartige Kombination sein, da C ++ eine leistungsstarke Sprache ist und .NET Framework für die GUI-Programmierung unter Windows bevorzugt wird, wie ich gelesen habe. Ist es möglich, die GUI in C # und die Funktionalität in C ++ zu schreiben?

ddacot
quelle
7
C # ist auch eine sehr mächtige Sprache.
Adam Crossland
2
@Ramhound: Es stimmt überhaupt nicht, dass C ++ / CLI so leistungsfähig ist wie C #. C ++ / CLI-Code enthält alle Optimierungen des C ++ - Compilers und kann schneller ausgeführt werden. Er enthält weiterhin viele Metaprogrammierungs- und Präprozessortechniken, die nicht in C # enthalten sind.
DeadMG
2
Außerdem sollte es keine Herausforderung sein, C # zu erlernen, wenn man gut in C ++ ist. Ich sage nicht, aber ich sage.
Rig
4
Wenn Sie C ++ kennen, haben Sie die Wahl zwischen C ++ / CLI oder C #. Weder ist tatsächlich C ++. Ich würde vorschlagen, C # zu lernen, anstatt zu versuchen, mit C ++ / CLI zu arbeiten. C ++ / CLI ist nirgendwo eine Muttersprache, daher finden Sie eine Menge Bücher und Unterstützung für C #.
David Thornley
6
@ddacot nein, C ++ ist überhaupt nicht für die Spieleentwicklung gedacht . Es ist wie alle anderen Programmiersprachen für die Softwareentwicklung gedacht. Spiele sind einfach eine Art von Software.
MattDavey

Antworten:

21

Ja, früher bekannt als Managed C ++ und jetzt als C ++ / CLI . Sie haben Zugriff auf das gesamte .NET Framework (GUI: WinForms, GDI + usw.) wie auf die anderen drei verwalteten Bundlesprachen C #, F # und VB.NET.

Jesse C. Slicer
quelle
+1 Auf Jesses Antwort. Wenn ich mich nicht irre, unterstützt C ++ / CLI keine Mehrfachvererbung. Seien Sie also auf einige unerwartete Funktionen vorbereitet. Einige dieser Funktionen sind auf Einschränkungen der CLI zurückzuführen. Ich empfehle, dass Sie versuchen, den Unterschied zwischen C ++ / CLI und "klassischem" C ++ herauszufinden, bevor Sie es verwenden.
Igor Soloydenko
Dies wird im ersten Link ausführlich erwähnt. Die Zusammenfassung lautet daher: "C ++ hat sich im Laufe der Zeit stark weiterentwickelt und die meisten in der Sprache geschriebenen Softwareprogramme sind objektorientiert. Verwaltetes C ++ und die Verwendung von Klassen und klassenbasierten Objekten sind wie in Visual C ++ weiterhin weit verbreitet. Die einzige wesentliche Änderung in Managed C ++ betrifft dies Dies liegt an der Einschränkung der CLR. Eine Klasse, die unter dem Garbage Collector der CLR verwaltet wird, kann nicht mehr als eine Klasse erben. "
Jesse C. Slicer
Das ist okay. Eigentlich bin ich nicht gut in C ++. Ich dachte nur, dass es noch andere wichtige Unterschiede geben kann, die Probleme verursachen können.
Igor Soloydenko
Das letzte Mal, dass ich etwas C ++ schrieb, war buchstäblich irgendwann im letzten Jahrhundert :)
Jesse C. Slicer
1
@keykeeper, eine typische Verwendung von C ++ / CLI besteht darin, eine dünne Brücke zwischen einer nicht verwalteten C ++ - Bibliothek und der verwalteten Welt zu bilden. Für eine solche Verwendung ist es ausreichend. Natürlich macht es keinen Sinn, etwas Größeres darin zu codieren.
SK-logic
6

Vergessen Sie nicht die flexibelste und einfachste Option, die für die Unix-Welt typisch ist, aber aus irgendeinem Grund in Windows nicht so häufig vorkommt: Aufteilen von GUI und Logik in verschiedene Prozesse, Kommunikation über jede vernünftige Form von RPC (z. B. auch über eine Pipe) Arbeit). Vorzugsweise mit einem einfachen, lesbaren Textprotokoll.

Auf diese Weise können Sie Ihre GUI (oder verschiedene GUIs) mit jeder gewünschten Technologie implementieren und Logikkomponenten aufbauen, die den Anforderungen besser entsprechen - C ++, Skripte usw.

Ich kenne keine vernünftigen Vorteile eines monolithischen Designansatzes aus der Windows-Welt.

SK-Logik
quelle
4

Das habe ich vor ein paar Jahren einmal gemacht, damals in den Tagen von Managed C ++. Wir hatten einige Geschäftslogik in einer umanagten DLL, die wir in eine in C # geschriebene GUI im Assistentenstil integrieren wollten. Zu diesem Zweck habe ich eine verwaltete C ++ - Assembly zwischen der verwalteten GUI-App und der nicht verwalteten DLL erstellt und System :: Runtime :: InteropServices :: Marshal in dieser Assembly verwendet, um Werte von verwalteten Typen (System :: Int32) in nicht verwaltete zu konvertieren types (int) und umgekehrt.

Managed C ++ scheint veraltet zu sein, für C ++ / CLI kann jedoch das gleiche Prinzip gelten.

Raymond Saltrelli
quelle
3

Nicht wirklich. Es gibt eine hybride C ++ / CLI-Sprache, die jedoch nur für die Interoperation geeignet ist (offizielle Richtlinie von Microsoft). Aufgrund der Art und Weise, wie das .NET-Framework entworfen wurde, gibt es viele Sprachsemantiken, die in der CLR wirklich nicht funktionieren, und C ++ weist viele davon auf.

DeadMG
quelle
7
Ich bin mit dieser Aussage nicht einverstanden. C ++ / CLI eignet sich perfekt für viele Implementierungen.
Ramhound
3
@Ramhound: Microsoft selbst empfiehlt es nur zur Interoperation. Das ist ihre offizielle Politik.
DeadMG
2
@DeadMG können Sie eine Quelle dafür bereitstellen?
sq33G
1
@DeadMG, du liegst falsch. Es gibt so viele Möglichkeiten, .NET GUI mit einer nativen Logik auszuführen.
SK-logic
2
@DeadMG - Sofern Sie nicht beweisen, dass dies die offizielle Richtlinie von Microsoft ist (ich glaube das keine Minute), geben Sie einfach
FUD weiter
3

Der C ++ / CLI-Winkel wurde bisher von zahlreichen Antworten abgedeckt. Eine andere Möglichkeit hierfür ist die Verwendung von PInvoke. Auf diese Weise können C # -Programme Funktionen aufrufen, die in in C ++ geschriebenen DLLs enthalten sind. Der Vorteil von PInvoke ist, dass Ihre DLL völlig unabhängig von der Tatsache ist, dass sie von .Net aufgerufen wird. Das heißt, Sie können DLLs aufrufen, für die Sie keinen Quellcode haben, und selbst wenn Sie den Quellcode hätten, müssten Sie ihn nicht mit der Option / clr neu kompilieren. Dies bedeutet, dass Sie diese DLL mit anderen C ++ - und C # -Programmen verwenden können. Es gibt einige fantastische C / C ++ - Bibliotheken: Mit PInvoke können Sie diese nutzen. Manchmal bieten Win32-Bibliotheken Funktionen, die in .Net nicht verfügbar sind: Mit PInvoke können Sie sie verwenden.

Eine der schwierigsten Aufgaben bei der Verwendung von PInvoke besteht darin, die nicht verwaltete Signatur in eine verwaltete Signatur umzuwandeln. Aber es gibt einen Spickzettel , der dabei hilft.

Phillip Ngan
quelle
Achten Sie beim direkten Aufrufen von C ++ auf das Mangeln, oder stellen Sie einen dünnen C-Wrapper dazwischen bereit.
SK-logic
0

Sie können auch über COM (Component Object Model) mit einem C # -Dill arbeiten. Für mich war COM besser als die Verwendung von Managed C ++, da Visual Studio 2010 kein Intellisense für Managed C ++ besitzt. In meinem Fall haben wir bereits eine große C ++ - Anwendung, wollten aber versuchen, von MFC zu WinForms oder WPF zu wechseln.

Travis
quelle