Wird C ++. Net ausgiebig genutzt?

25

Ich bin traditionell ein C ++ - Programmierer. In den letzten 12 Monaten habe ich viel C # -Codierung durchgeführt und war angenehm überrascht von der pragmatischen Herangehensweise von C # (nachdem ich aufgehört hatte, es so zu codieren, als wäre es "C ++ mit Garbage Collection").

Wir hatten kürzlich einige Absolventen in und als ich einer von ihnen half, stellte ich fest, dass sie .Net in C ++ verwendete. Auf die Frage nach dem Grund wurde ihr von ihrem Manager gesagt, dass sie "C ++ verwenden soll". Abgesehen von offensichtlichen Kommunikationsproblemen gehe ich davon aus, dass sie .Net verwendet hat, da dies das einzige Framework ist, dem sie ausgesetzt war.

Dann stieß ich auf ein altes Projekt eines leitenden Entwicklers, der auch C ++ zur Steuerung eines Forms-Frontends verwendete. Nun, dies wäre zu der Zeit geschrieben worden, als .Net zum ersten Mal erschien. Ich nehme an, es war eine Lernübung für ihn, mit .Net herumzuspielen. Es war nur eine kleine Utility-App.

Nachdem ich einige kleinere Änderungen an dieser App vornehmen musste, schien es mir, dass die Verwendung von C ++ zur Steuerung von .Net das Schlimmste von beiden Welten ist. Keine Speicherbereinigung oder Speichersicherheit, aber keine wirklichen Möglichkeiten zur Geschwindigkeits- / Optimierungsoptimierung, da es sich um ein verwaltetes Framework handelt.

Meine Frage ist also, ob die Leute C ++ .Net für einen großen eigenständigen (dh nicht installierten) Produktionscode verwenden, und wenn ja, welche Gründe sprechen dafür? Ich gebe frei zu, dass ich mich noch nie intensiv mit den C ++ .Net-Erweiterungen befasst habe, so dass ich es möglicherweise als schlechten Dienst ansehen kann.

GazTheDestroyer
quelle

Antworten:

32

C ++. NET (oder genauer gesagt C ++ / CLI) verfügt über eine Garbage Collection, genau wie alles andere, was unter .NET ausgeführt wird. Um dies zu erreichen und gleichzeitig mit C ++ kompatibel zu bleiben, werden ^Syntax- und gcnewGarbage-Collected-Zeiger (sichere Zeiger) verwendet.

C ++ / CLI wird von vielen als Greuel betrachtet, es ist wesentlich unangenehmer, mit C # oder C ++ zu arbeiten, und auch komplizierter als mit beiden (einfach, weil es die Komplexität von C ++ selbst in die Tabelle einbringt und das Nötige hinzufügt, um zu arbeiten mit .NET zum mixen). Das Erlernen von C # zahlt sich in der Regel bereits im Rahmen eines einzelnen mittelgroßen Projekts aus. Es gibt jedoch eine Möglichkeit, die weder C # noch natives C ++ bietet: Vorhandenes C ++ gegen .NET kompilieren und mit anderen .NET-Komponenten kommunizieren zu lassen.

Infolgedessen ist es wenig sinnvoll, C ++ / CLI für ein von Grund auf neu erstelltes Projekt zu verwenden - alles, was mit .NET zu tun hat, kann auch in C # ausgeführt werden, mit einer viel schöneren Syntax und der zusätzlichen Sicherheit, kein Raw verfügbar zu machen Zeiger standardmäßig. Sein wichtigstes Ziel ist die Portierung vorhandener Codebasen nach .NET. Ein Unternehmen, das sich für die Verwendung von .NET entscheidet, jedoch nicht bereit ist (oder aufgrund von Ressourcen- und Zeitbeschränkungen nicht in der Lage ist), alle bisher erstellten Softwarekomponenten neu zu schreiben, kann C ++ / CLI verwenden, um die vorhandene Codebasis mit nur minimalen Änderungen zu verwenden. und schreiben Sie dann die Komponenten ihres Systems nacheinander in C #. Zumindest ist das die Theorie; Ich habe es selbst noch nie in der Praxis gesehen, daher kann ich nicht sagen, wie gut es funktioniert.

Beachten Sie auch, dass C # selbst eine Schnittstelle mit nativen Bibliotheken herstellen kann. Selbst wenn Sie vorhandene C ++ - Codebasen verwenden müssen, müssen Sie diese nicht unbedingt mit .NET neu kompilieren: Oft ist eine Schnittstelle mit COM oder P / Invoke die bessere Lösung .

tdammers
quelle
10
Bitte beachten Sie, dass die 'Schnittstelle mit nativen Bibliotheken' mit P / Invoke auf DLLs mit statischen Funktionen beschränkt ist und COM für sich genommen ein Problem darstellt. Mit einem Wrapper in C ++ / CLR können Sie mit wenigen Einschränkungen sauber auf ein natives Backend / Projekt in voller Größe in Ihrem C # -Code zugreifen. Ich würde es nicht für die Entwicklung verwenden, aber als Klebstoff ist es VIEL sauberer als P / Invoke und es ist Marshalling.
Max
Seconded - Und ich denke, Microsoft hat stillschweigend zugestimmt, was die Art und Weise betrifft, in der C ++ an seinem rechtmäßigen Platz in der nativen Entwicklung neu ausgerichtet wurde.
Josh Greifer
2
Beachten Sie, dass die Sprache tatsächlich C ++ / CLI heißt und nicht C ++. NET.
Svick
@svick: Richtig. Bearbeitet
Tdammers
1
@Max TBH Microsoft hat alles nativ gemacht. Jetzt brauchen Sie C ++ / CLI überhaupt nicht mehr. Sie müssen diese fiesen Wrapper nicht mehr schreiben, um C # mit systemeigenem Code zu verbinden. Stellen Sie einfach sicher, dass es sich um WinRT / COM-Objekte handelt, und Sie sind fertig.
Gbjbaanb