Frage

Für eine große Anwendung geschrieben in C++ mit Visual Studio 6, was ist der beste Weg, um sich in das moderne Zeitalter?

Ich möchte ein inkrementelles Vorgehen, wo wir langsam bewegen Teile des Codes schreiben und neue features in C# zum Beispiel und zu kompilieren, die in einer Bibliothek oder dll kann verwiesen werden, aus der legacy-Anwendung.

Ist das möglich und was ist der beste Weg, es zu tun?

Bearbeiten:An diesem Punkt sind wir beschränkt auf den Express-Editionen, die glaube ich, nicht erlauben die Verwendung der MFC-Bibliotheken, die Massiv in unsere aktuelle app.Es ist auch eine ganz große app mit viel hardware-Abhängigkeiten, so glaube ich nicht, dass Großhandel migration in die Karten.

Edit2:Wir haben uns umgeschaut in das schreiben von COM-eingewickelt-Komponenten in C#, aber ohne COM-Erfahrung das ist beängstigend und kompliziert.Ist es möglich zu erzeugen eine C# - dll mit einer sofort-C-Schnittstelle mit allen verwalteten Güte im inneren verborgen?Oder ist COM-ein notwendiges übel?

War es hilfreich?

Lösung

Angesichts der gleichen Aufgabe wäre meine Strategie so etwas wie:

  1. Identifizieren Sie, was wir hoffen, durch die Entwicklung von 2010 zu gewinnen - es könnte sein

    • Verbesserte Qualitätssicherung: Unit -Tests, Spott sind Teil moderner Entwicklungstools
    • Slicker UI: WPF bietet ein modernes Erscheinungsbild.
    • Produktivität: In einigen Bereichen ist die .NET -Entwicklung produktiver als C ++ - Entwicklung
    • Unterstützung: Neue Tools werden mit Verbesserungen und Bugfixen unterstützt.
  2. Identifizieren Sie, welche Teile des Systems nicht von C#bewegt werden:

    • Hardwarezugriff, algorithmischer Code auf niedriger Ebene
    • Ziemlich maßgeschneiderte Nicht -UI -Arbeitscode - es macht keinen Sinn, ihn herauszuwerfen, wenn er bereits funktioniert
  3. Identifizieren Sie, welche Teile des Systems auf C#migriert werden müssen. Stellen Sie für diese Teile sicher, dass die aktuelle Implementierung in C ++ entkoppelt und modular ist, damit diese Teile ausgetauscht werden können. Wenn die App ein Monolith ist, werden beträchtliche Arbeiten benötigt, um die App so zu verarbeiten, dass sie in C#neu implementiert werden kann. (Es ist möglich, nichts zu überarbeiten, sondern sich nur auf die Implementierung neuer Anwendungsfunktionen in C#zu konzentrieren.)

  4. Nachdem Sie nun identifiziert haben, welche Teile in C ++ bleiben und welche Teile in C#implementiert werden (oder nur feststellen, dass neue Funktionen in C#sind), wandelt sich der Fokus auf die Integration von C#und C ++ in eine einzelne Lösung zu

    • Verwenden Sie Com -Wrapper - Wenn Ihr vorhandenes C ++ - Projekt OO gut nutzt, ist dies oft nicht so schwierig, wie es erscheinen mag. Mit MSVC 6 können Sie die ATL -Klassen verwenden, um Ihre Klassen als COM -Komponenten freizulegen.
    • Integrieren Sie direkt den nativen und C# -Code. Das Integrieren von "Legacy" kompilierter Code erfordert eine Zwischen -DLL - siehe hier für Details.

Das Mischen der MFC UI und C# UI ist wahrscheinlich nicht erreichbar und auch nicht ratsam, da sie eine UI -Mischung aus zwei unterschiedlichen Stilen (Grey und 2010 Vibe) erzeugen würde. Es ist einfacher, sich auf eine inkrementelle Migration zu konzentrieren, z. B. die Implementierung neuer Anwendungscode in C# und das Aufrufen des nativen C ++ - Code. Dadurch wird die Menge an migriertem C# -Codus von Anfang an klein. Wenn Sie mehr in die Entwicklung von 2010 eingehen, können Sie die größeren Brocken wie die Benutzeroberfläche wie die Benutzeroberfläche nicht migriert werden.

Andere Tipps

Ich möchte ein inkrementelles Ansatz, wo bewegen wir uns langsam Portionen der code

Das ist der einzige realistische Weg, es zu tun.

Erstens, welche Art von Versionskontrolle verwenden Sie?(Wenn Sie verwenden Verzweigung, version control, die es Ihnen ermöglicht, Experimente zu machen und sehen, was funktioniert, während die Minimierung des Risikos der Beeinträchtigung Ihrer Codes;andere sind auch OK, aber Sie müssen wirklich vorsichtig sein, je nachdem, was Sie verwenden).

Bearbeiten:Ich sah nur Sie sind über SVN.Es kann interessant sein, sich zu bewegen, um mercurial oder git, ob Sie haben die Freiheit, das zu tun (die änderung stellt einen Quantensprung in dem, was Sie tun können, mit der code-Basis).

schreiben und neue features in C# für Beispiel kompilieren und in eine - Bibliothek oder dll, die referenziert werden können aus der legacy-Anwendung.

Das ist ...nicht unbedingt eine gute Idee.C# - code verfügbar, COM-Schnittstellen, die sind in C++.Schreiben Sie client-code in C++ für Module, die in C# geschrieben, kann Spaß machen, aber Sie können finden es anstrengend (im Sinne von Aufwand zu nutzen Verhältnis);Es ist auch langsam und fehleranfällig (im Vergleich zum schreiben von C# - client-code für Module, die in C++geschrieben).

Besser sollten Sie das erstellen einer application framework in C# und unter Verwendung von Modulen (bereits) geschrieben in C++ für die wichtigsten Funktionen.

Ist dies möglich und welche ist die beste Weg, es zu tun?

Ja, es ist möglich.

Wie viele Menschen sind in das Projekt involviert?

Wenn es sind viele, der beste Weg wäre, ein paar (zwei?vier?) die arbeiten an der neuen Anwendungs-framework und den rest wie gewohnt weiter.

Wenn es sind paar, Sie betrachten können, die entweder eine person oder mehr, Menschen, Teilzeit zu arbeiten auf es.

Der Anteil der Personen/Aufwand zugeordnet auf jeder (alt-code Wartung und neue code-Entwicklung) sollte abhängig von der Größe des Teams und Ihre Prioritäten (Ist der übergang von niedriger Priorität Thema?Ist es notwendig, fertig zu sein von einem bestimmten Datum?)

Der beste Weg, dies zu tun wäre, um zu starten die Anpassung der Module der code noch verwendet werden in mehrere Szenarien (mit den alten code und die neue) und weiterhin die Entwicklung in parallel (wieder, dies wäre sehr erleichtert durch die Verwendung einer Abzweigung distributed version control system).

Hier ist, wie ich gehen würde, über Sie (die iterative Entwicklung, mit kleinen Schritten und viel Plausibilitätsprüfungen in zwischen):

  1. Pick a functional module (etwas, was nicht GUI-bezogene) in der alten code-Basis.

  2. Entfernen MFC-code (und in anderen Bibliotheken, die nicht in VS2010 Express - wie ATL) Referenzen aus dem Modul nahm in Schritt 1.

    Tun nicht versuchen zu umschreiben, MFC/ATL-Funktionalität mit benutzerdefinierten code, es sei denn, für kleine änderungen (, dass ist, es ist nicht möglich, zu entscheiden, zu erstellen Sie Ihre eigenen GUI-framework, aber es ist OK, zu entscheiden, zu schreiben, Ihre eigenen COM-interface-pointer-wrapper-ähnlich ATL CComPtr).

    Wenn der code schwer von einer Bibliothek abhängt, besser zu trennen, so viel wie möglich, dann markieren Sie es nach unten, um umgeschrieben werden zu einem späteren Zeitpunkt mit neuen Technologien.Entweder Weg, für eine Bibliothek stark abhängig MFC-du bist besser dran, den code umschreiben, mit etwas anderem (C#?).

  3. reduzieren Sie die Kopplung mit dem gewählten Modul so viel wie möglich (stellen Sie sicher, dass der code in einer separaten Bibliothek, entscheiden Sie klar, welche Funktion das Modul stellt den client-code) und den Zugriff auf die getrennte Funktionalität nur durch die entschieden ausgesetzt interface (in den alt-code).

  4. Stellen Sie sicher, dass Sie den alten code-Basis arbeitet immer noch mit der modifizierten Modul (test - schließlich automatisieren Sie die Prüfung für dieses Modul) - dies ist kritisch wenn Sie müssen noch bleiben in die Markt, bis Sie Schiff die neue version.

  5. Unter Beibehaltung der aktuellen Anwendung, starten Sie ein neues Projekt (C# - Basis?) implementiert das GUI und andere Teile, die Sie benötigen, zu modernisieren (wie die Teile stark abhängig MFC).Dies sollte eine dünne Schicht Anwendung, vorzugsweise Agnostiker, der die business-Logik (die bleiben in der legacy-code so viel wie möglich).

    Je nachdem, was der alte code funktioniert und die Schnittstellen Sie definieren, kann es sinnvoll sein, die C++/CLI anstelle von C# für die Teile des Codes (es kann Arbeit mit nativen C++ - Zeiger und verwalteten code, so dass Sie zu einem reibungslosen übergang, wenn comunicating zwischen verwalteten .NET-code und C++ nativen code).

  6. Stellen Sie die neue Anwendung verwenden Sie das Modul nahm in Schritt 1.

  7. Wählen Sie ein neues Modul, gehen Sie zurück zu Schritt 2.

Vorteile:

  • refactoring durchgeführt werden (nötig für die Trennung der Module)

  • am Ende sollten Sie eine Reihe von tests für Ihr funktionale Module (wenn Sie nicht bereits).

  • Sie haben noch etwas zu Schiff in zwischen.

Ein paar Anmerkungen:

  • Wenn Sie nicht mit einer verteilten Verzweigungen version control system, sind Sie besser dran, die Arbeit an einem Modul in einer Zeit.Wenn Sie verwenden Verzweigung/distributed source control, verteilen Sie verschiedene Module für die verschiedenen team-Mitglieder, und zentralisieren Sie die änderungen jedes mal etwas neues portiert wurde.

  • Es ist sehr wichtig, dass jeder Schritt ist klar abgegrenzt (so, dass können Sie Ihre änderungen rückgängig, um die Letzte stabile version, neue Dinge auszuprobieren, und so weiter).Dies ist ein weiteres Problem, das schwierig ist, mit SVN und einfach mit Mercurial / Git.

  • Bevor Sie beginnen, ändern Sie die Namen aller Ihrer Projektdateien zu haben .2005.vcproj-Erweiterung, und machen Sie dasselbe für die solution-Datei.Beim erstellen des neuen Projektes Datei, tun das gleiche mit .2010.vcxproj für das Projekt-Dateien und Lösung (sollten Sie noch dies tun wenn Sie konvertieren die Lösungen/Projekte).Die Idee ist, dass Sie sollten haben beide parallel und öffnen Sie je nachdem, was Sie wollen, an jedem beliebigen Punkt.Sollten Sie nicht haben, um ein source-tree zu aktualisieren, um ein anderes label/tag/Datum in source control einfach zu wechseln IDEs.

Edit2:Wir haben uns umgeschaut in dem schreiben COM-eingewickelt-Komponenten in C# aber ohne COM-Erfahrung das ist beängstigend und kompliziert.

Sie können es tun, indem Sie sich schriftlich wrapper-code (eine kleine Vorlagen-smart-pointer-Klasse für COM-Schnittstellen nicht übel, zum Beispiel - ähnlich wie CComPtr in ATL).Wenn Sie isoliert die COM code, hinter dem sich einige Wrapper, die Sie schreiben, könnte der client-code (Agnostiker COM) mit (fast) keine Probleme.

Ist es möglich zu erzeugen eine C# - dll mit einem straight-C-Schnittstelle, mit allen das verwaltete Güte im inneren verborgen?Oder ist COM-ein notwendiges übel?

Nicht dass ich wüsste.Ich denke COM ein notwendiges übel, wenn Sie planen, server-code in C# geschrieben und der client-code in C++.

Es ist möglich, dass die andere Weise herum.

Erstens ist Ihre Definition der modernen Ära umstritten. Es gibt keinen Grund, anzunehmen, dass C# in irgendeiner Weise besser ist als C ++. Es wurde viel gesagt, ob C# Ihnen hilft, Fehlerverwaltungsfehler besser zu vermeiden, aber dies ist kaum mit modernen Einrichtungen in C ++, und es ist sehr einfach, mit C# in Bezug auf das Timing des Ressourcenerwerbs zu tun, das möglicherweise davon abhängt, was Andere Programme tun.

Wenn Sie sich direkt von 6 bis 2010 bewegen, erhalten Sie möglicherweise einige durcheinandergebrachte Projekteinstellungen. Wenn dies kein ziemlich großes Projekt ist und es eines von wenigen ist, die Sie konvertieren müssen, sollte das in Ordnung sein. Öffnen Sie es einfach im Jahr 2010 und folgen Sie dem Conversion -Assistenten. Stellen Sie sicher, dass Sie Ihr Projekt zuerst sichern, und überprüfen Sie Ihre Projekteinstellungen, wenn Sie fertig sind.

Meiner Meinung nach besteht der beste Weg, es Schritt für Schritt durch jede Iteration von Visual Studio zu konvertieren. Ich musste 1400 Projekte von 2003 bis 2010 modernisieren, und der beste Weg, das ich fand, bestand darin, alles in 2005, dann auf 2008 und schließlich bis 2010 umzuwandeln. Dies führte zu den geringsten Problemen für mich.

Wenn Sie nur 6 und das neueste Visual Studio haben, müssen Sie nur versuchen, mit dem Assistenten direkt zum neuen zu gehen. Erwarten Sie eine manuelle Reinigung, bevor alles für Sie wieder korrekt aufbaut.

Auch noch einmal, um es zuerst zu sich zu ziehen! :)

High-Level-C ++-Code, das C# -Codel mit niedrigem Niveau aufruft, sieht nicht nach einer guten Idee aus. Die Bereiche, in denen .NET -Sprachen besser sind, sind Benutzeroberflächen, Datenbankzugriff, Netzwerk und XML -Dateien. Niedrige Dinge wie Berechnungen, Hardware-Zugriff usw. sind besser als natives C ++-Code.

Wenn Sie zu .NET wechseln, ist es in den meisten Fällen besser, die Benutzeroberfläche vollständig neu zu schreiben, indem Sie WPF- oder Windows Forms -Technologien verwenden. Low-Level-Sachen bleiben nativ, und verschiedene Interoperabilitätstechnologien werden verwendet, um C# und native Code zu verbinden: Pinvoke, C ++/CLI-Wrapper oder COM-Interoperabilität. Nach einiger Zeit können Sie sich entscheiden, native Komponenten mit niedrigem Niveau in C#neu zu schreiben, nur wenn dies wirklich notwendig ist.

Über das Kompilieren des nativen C ++ - Code in VS2010 - Ich sehe keine Probleme. Beheben Sie einfach alle Kompilierungsfehler - Neue Compiler haben strengere Einschränkungen bei der Überprüfung und Syntax und fangen viel mehr Fehler zur Kompilierungszeit auf.

Ich bin mir nicht sicher, warum so viele Leute sich für COM einsetzen. Wenn Sie dort noch nicht viel COM haben, wird es weh tun, zu lernen, wie man es auf der C ++ - Seite macht, und dann verwenden Sie die langsamste Interop von der verwalteten Seite. Nicht meine erste Wahl.

Idealerweise haben Sie Ihre Benutzeroberfläche von Ihrer Geschäftslogik neu gestellt. Sie können dann eine neue Benutzeroberfläche (WPF, WinForms, ASP.NET, Webdienste, die einen anderen Client unterstützen) erstellen und Ihre Geschäftslogik durch P/Invoke oder durch das Schreiben einer C ++/CLI -Wrapper in Ihre Geschäftslogik aufrufen. @MDMA hat gute Ratschläge für Sie unter der Annahme, dass das Refactoring möglich ist.

Jedoch Wenn Sie mich dafür bezahlen würden, dass Sie hereinkommen und Ihnen helfen, meine erste Frage wäre, warum Sie das tun möchten? Einige Kunden sagen, dass sie C ++ Devs nicht mehr zahlen möchten, daher möchten sie, dass der gesamte C ++ - Code verschwunden ist. Dies ist ein beängstigendes Ziel, weil wir alle es hassen, Code zu berühren, der funktioniert. Einige Kunden möchten ihre Logik ASP.NET- oder Berichtsdiensten oder so aussetzen. Daher konzentrieren wir uns auf das Refactoring. Und einige sagen "Es sieht 1999 so aus" und für sie zeige ich ihnen, wie MFC jetzt aussieht. Farben, Skinning/Themen einschließlich Office und Win7 -Looks, Band, schwebende/dockene Scheiben und Windows, Windows 7 Taskleistenintegration ... Wenn Sie nur anders aussehen möchten, schauen Sie sich MFC in VS 2010 an und Sie müssen sich möglicherweise nicht anpassen, und Sie müssen sich möglicherweise nicht anpassen, und Sie müssen sich möglicherweise nicht anpassen Jeder Code überhaupt.

Schließlich, um nicht-exprimierende Versionen von VS 2010 erschwinglichem Blick in das Microsoft Partner-Programm zu machen. Wenn Sie Ihre Software an mindestens 3 Kunden verkauft haben, die immer noch mit Ihnen sprechen und durch den Windows 7-Logo-Selbsttest kommen können Von allem (Windows, Büro, vs) für 1900 US -Dollar pro Jahr, je nachdem, wo Sie wohnen.

Zu Beginn würde ich versuchen, so viel Code wie möglich zu behalten, um ein Umschreiben zu vermeiden. Ich würde auch den gesamten nicht verwendeten Code entfernen, bevor ich mit der Konvertierung beginne.

Da VC ++ 6.0 Microsoft die MFC -Bibliotheken und die C ++ - Standardbibliothek geändert hat.

Ich empfehle, Ihre DLLs ohne Abhängigkeiten aufzubauen und dann Ihre Bibliotheken Dritter zu betrachten und dann jeweils eine abhängige DLL/EXE wieder aufzubauen.

Führen Sie Unit -Tests ein, um sicherzustellen, dass sich das Verhalten von Code nicht ändert.

Wenn Sie einen gemischten Build mit verschiedenen Versionen von VC ++ verwenden, müssen Sie sich gegen die Übergabe von Ressourcen (Dateihandles) zwischen DLLs, die verschiedene Versionen der VC -Laufzeit verwenden, bewachen.

Wenn ich finanziell möglich möglich ist, würde ich nachdrücklich in Betracht ziehen, das Geld für die Version von Visual Studio zu bezahlen, die Sie benötigen, weil Sie bei der Zeit, die Sie ausgeben, sehr gut mehr Geld verlieren könnten. Ich weiß nicht genug über die Express -Editionen, um eine gute Antwort auf sie zu geben, aber wenn ich einen Code von einem Subunternehmer integriert habe, der in C ++ geschrieben wurde, habe ich C ++ / CLI verwendet. Sie können wahrscheinlich den größten Teil Ihrer Codebasis wiederverwenden und mit der Sprache vertraut sein, aber Sie haben auch Zugriff auf verwaltete Code und Bibliotheken. Auch wenn Sie mit dem Schreiben von neuem Code in C# beginnen möchten, können Sie dies tun. Das größte Problem, das ich bei der VS 2010 hatte, war, dass es in C ++ / CLI kein Intellisense gibt.

Visual Studio 6 ist legendär dafür, fehlerhaft und langsam zu sein. Der Umzug in die moderne Ära würde am besten durch einen neuen Compiler getan werden. Was ist wahrscheinlich am einfachsten, die Legacy -App in eine DLL zu schreiben, dann Ihr EXE in C# zu schreiben und P/Invoke zu verwenden. Dann müssen Sie den alten Code nie wieder berühren- Sie können einfach immer mehr in C# schreiben und immer weniger von der alten DLL verwenden.

Wenn Ihr alter Code sehr stark oo ist, können Sie C ++/CLI verwenden, um Wrapper -Klassen zu schreiben, mit denen .NET Methoden auf C ++ - Objekten aufrufen und sie auch sammeln können, wenn Sie einen intelligenten Smart -Zeiger mit Referenz verwenden.

Sie können C# verwenden, um Ihre neuen Komponenten mit einem COM- oder COM+ (system.enterPrisesservices) -Wrapper zu schreiben, der von Ihrem vorhandenen C ++ - Code abgerufen werden kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top