2009-02-18 5 views
16

Ich lernte Windows-Programmierung mit Visual C++ und der Win32-API. Heutzutage scheint es, dass die meisten Apps in .NET mit C# entwickelt werden. Ich verstehe, dass es zwischen nativem Code und verwaltetem Code meistens nicht viel Leistungsunterschied gibt. Ich frage mich also, ob ich, wenn ich heute eine neue Desktop-App schreiben würde, einen anderen Grund hätte (abgesehen von der Tatsache, dass ich mit C++ besser vertraut bin), dass ich sie vielleicht lieber in nicht verwaltetem C++ schreiben würde von .NET? Gibt es noch einige Vorteile bei der Verwendung von C++ und nativem Code? Oder wurde diese Methode mehr oder weniger durch .NET auf der Windows-Plattform ersetzt?Welche Vorteile hat die Entwicklung einer Win32-Anwendung in C++ über eine .NET-Anwendung in C#?

Natürlich weiß ich, dass Menschen, die Low-Level-Gerätetreiber und ähnliche Programme schreiben, es in .NET nicht tun würden. Ich frage nach typischen Client-Apps, die keine direkten Hardware-Anrufe tätigen.

+0

Wenn die Entscheidung zwischen Win32 und .Net ist ... go .Net Mehrere Leute beschweren sich über .Net für ihre Plattform nicht ... aber wenn Sie für Win32 schreiben, ist diese Cross-Plattform kein Problem. –

+3

Ich entwickle immer noch regelmäßig in C++ Win32 - einschließlich brandneuer Anwendungen. Die meisten unserer Programme sind grafischer Natur mit sehr wenigen UI-Funktionen. Ich finde Leute, die nicht verwaltetes Gedächtnis verfluchen, wiederholen oft nur das, was sie gehört haben und nicht wirklich in C++. Ich bevorzuge es, "näher an der Hardware zu sein", um bestimmte Algorithmen zu optimieren. Außerdem werde ich ein großes Missverständnis korrigieren - die Lernkurve für win32 ist WENIGER als .NET und C# (vorausgesetzt, Sie sind in C++ erfahren). Siehe - http://www.charlespetzold.com/pw5/index.html. + Win32 installiert/läuft leicht alle Winvers. – Jeff

+0

Sorry, aber ich sehe selten .NET-Anwendungen in Aktion. Die meisten Windows-Programme werden heute in Win32API/MFC/Delphi/C++ Builder/wxWidget/Qt geschrieben. – dns

Antwort

14
  • Leistung (bestimmte Situationen, wie Grafiken)
  • Speicherbedarf (wie Mancuso sagte)
  • Nutzung vorhandener Bibliotheken
  • Keine Notwendigkeit für eine Laufzeit
  • Finer Steuerung

Um ein paar aufzulisten.

Sie können jedoch auch die Frage aus dem anderen Blickwinkel betrachten, um zu beurteilen, welche Sprache verwendet werden soll.

Darüber hinaus können Sie C++/CLI verwenden, um sowohl nativen als auch .net-Code zu integrieren.

2

Speicherbedarf. Aber wenn Sie nicht für eine schwer behinderte Maschine Speicher entwickeln, sollte es wirklich kein Problem für die meisten Anwendungen sein.

+2

. NET tendiert dazu, Speicher zu "hoggen" und nicht wieder an das Betriebssystem zu senden, es sei denn, sein verfügbarer Speicher fällt unter einen Schwellenwert. Es ist OK, wenn es wenige Instanzen Ihrer App gibt, die gleichzeitig ausgeführt werden und die meisten Ressourcen dafür verwenden. In anderen Situationen ist es eine Katastrophe. –

8

Wenn Ihre Anwendung ohne eine Installation ausgeführt werden kann (dh wenn Sie .NET Framework nicht installieren können oder sollten), können Sie nicht davon ausgehen, dass sich .NET auf einem Windows-Rechner befindet (Vor-Vista). Viele Utility-Anwendungen können in diese Kategorie fallen.

18

IMO die wichtigste für kleine herunterladbare Anwendungen ist, dass nativer Code die .NET-Laufzeitumgebung nicht benötigt. Während Breitband mehr und mehr verbreitet ist, hat es noch nicht jeder.

Einige Leute können enttäuscht sein, dass Ihre 2 MB-Anwendung tatsächlich noch weitere 20 MB Framework-Download erfordert und einen störenden Installationsprozess ausführt. Wenn sie nicht sicher sind, ob sie Ihre Anwendung wirklich benötigen oder nicht, können sie sie einfach löschen, bevor sie es einmal ausprobieren und sich einem Konkurrenzprodukt zuwenden.

+5

Ich wünschte ich könnte das öfter mal abstimmen. Wenn ich eine neue App ausprobieren will und es mich bittet, eine Runtime zu installieren, die ich noch nicht installiert habe, probiere ich sofort etwas anderes aus. –

+0

Wie oft installieren Sie eine neue Version von .NET Runtime oder JRE? Ich glaube, dass ich .NET 3.5SP1 im August 2008 installiert habe. –

+5

Olli: Sie sind ein Entwickler, der Sie zur Elite der Computeranwender macht. Wenn Ihre Kunden nicht auch Entwickler sind (und vor allem, wenn es sich um unerfahrene Benutzer handelt, die ihren Computer kaum benutzen), wird etwa die Hälfte von ihnen die Runtime wahrscheinlich nicht installiert haben. –

2

Wenn Sie sich die Abhängigkeit vom Stack leisten können, gehen Sie für .NET Modern, elegant, leistungsstark und als Ergebnis viel schneller für zu entwickeln.

Aber erkennen Sie, dass Sie Ihre App daran ketten - an die Sprache und den Rahmen, wenn Sie eine Zukunft vorhersehen, in der Sie dem entfliehen wollen, dann denken Sie besser zweimal nach.

Win32 ist alt und klobig, aber es funktioniert auf praktisch jeder Windows-Version ohne zusätzliche Abhängigkeiten, und Ihr Code kann in einfachen, portablen, C/C++ sein.

2

+1 für kein .NET-Paket/Installation auf den Zielcomputer (s) erforderlich. Das ist immer noch ein großes Problem.

Wenn alle Maschinen Mono oder NET haben, wird es keine große Sache sein.

0

Zwei Dinge, die ich mir vorstellen kann.

  1. Schutz des geistigen Eigentums. Es ist unendlich viel schwieriger für jemanden, eine Unmanaged C++ - App rückzuentwickeln. Verwaltete .Net- oder Java-Apps können leicht dekompiliert werden, dies ist bei Unmanaged C++ nicht der Fall.

  2. Geschwindigkeit. C++ ist näher an der Hardware und hat einen kleineren Speicherbedarf als der andere erwähnte Kommentar. Aus diesem Grund werden die meisten Videospiele weiterhin in C++ und Inline Assembly geschrieben.

+0

Äpfel mit Bananen vergleichen. C++ ist eine Multi-Plattform-Sprache, mit der Code für die .NET-Umgebung erstellt werden kann. Diese App wäre genauso leicht zu dekompilieren wie eine C#/CLR oder Java/JVM. Und dann, wenn ich mich richtig erinnere, kann GCC Java zu nativem Code kompilieren, also ist dieser Punkt strittig. –

+0

Eigentlich ist es überhaupt nichts, alles hängt davon ab, welchen Compiler Sie verwenden. Der Punkt ist wahr, wenn der Code in verwaltetem Code kompiliert wurde. Aber wenn Sie kompilierten zu nicht gemanagtem Code, dann steht mein Punkt immer noch. – James

+2

Es ist kaum ein Schutz, die Verschleierungstechniken für verwalteten Code sind im Vergleich schwach. Haben Sie jemals versucht, nativen Code wieder in funktionierendes C++ zu zerlegen? Vertrauen Sie mir, es ist unendlich schwieriger zu tun, als eine verwaltete App zurückzuentwickeln, bei der es irgendwelche kostenlosen Tools gibt, die das jetzt tun. – James

7

würde ich empfehlen jede Desktop-Anwendung zu schreiben, in Code verwaltet. .NET/C# ist eine großartige Plattform dafür.

Meine Gründe:

  1. Strafe Leistung ist vernachlässigbar. Google für Benchmarks, wenn Sie mein Wort nicht nehmen. Was mehr zählt, ist der Code selbst. Sie können O (n^m) -Algorithmen in C++ oder .NET/C# schreiben. JIT-Motoren sind heutzutage sehr ausgereift.
  2. Unmanaged C++ hat große Nachteile, wenn es darum geht Komponententests, Mocking und Refactoring. Es ist sehr umständlich und unflexibel. Reflection ermöglicht verwalteten Code, um solche Dinge sehr praktisch zu machen.
  3. Die Bereitstellung ist ein kleines Problem. Es ist jedoch ein Kinderspiel, ein Setup zu erstellen, das nach den notwendigen .NET-Vorbedingungen sucht und diese automatisch installiert.
  4. Kompilierung ist schneller, kein Linker! Es passiert sogar im Hintergrund, wenn Sie den Code bearbeiten.
  5. . NET Bibliothek Unterstützung ist viel besser und sauberer als STL, MFC und Boost.
  6. Keine Header-Dateien und Makros. Sie sind nur fehleranfällig.
  7. Sicherheit! Auf Wiedersehen Pufferüberläufe, schlechte Zeiger, nicht initialisierte Variablen ...
  8. Ausnahmen. Löschen Sie die Ausnahmehierarchie in .NET. C++ - Ausnahmen sind durcheinander.
+1

Nichts könnte weiter von der Wahrheit entfernt sein. Die Leistungseinbuße beim Ausführen ist eine verwaltete Umgebung ist riesig. Sie haben wenig oder gar keine Kontrolle darüber, wie der Speicher verwaltet wird. Dies ist eine Katastrophe für Apps, die eine Echtzeitleistung benötigen, wie Videospiele. Managed-Lösungen eignen sich in der Regel am besten für Geschäftsanwendungen. – James

+1

Und Sie sind mit einer Windows-Lösung fest. Schade für all diese Mac-Benutzer ... – user52875

+0

Zugegeben, Unmanaged C++ ist nicht in jeder Situation sinnvoll. Aber es hat immer noch Vorteile in bestimmten Szenarien für die Absicht der ursprünglichen Frage.Sie würden von all diesen Kommentaren denken, dass Unmanaged C++ keinen Platz mehr hat (nicht wahr). – James

0

.Net-Programme haben auch eine Lebensdauer, wo native nicht wirklich. Native wird für viele Jahre auf verschiedenen Betriebssystemen ausgeführt, ohne dass Updates erforderlich sind.

.Net-Programme können durch schlechte .Net-Konfiguration abgespritzt werden, native läuft einfach weiter und wird kaum von OS-Updates beeinflusst.

.Net Programme Start langsam und fühlen sich träge, native startet schnell und läuft schnell.

.Net muss für den kleinsten gemeinsamen Nenner codiert werden (die meisten verteilte Framework-Version), Native kompiliert den gesamten Code in die Anwendung - also verwenden Sie, was Sie wollen.

Verwenden Sie Delphi für Native, nicht C++. .Net basiert teilweise auf Delphi RAD und Java Backend.

Verwandte Themen