Ich habe eine große Menge Code für ein MFC/ATL-Programm, das ich in einer Windows-Form-Anwendung verwenden möchte. Was ist der einfachste Weg, diesen Code zu "konvertieren", so dass er mit/clr enabled kompiliert wird und die Basisklassen findet, z.B. CObject, CString, CFile und die Vorlagen?Konvertieren von MFC/ATL-Code in Windows Form App
Antwort
Es gibt nicht viel "Umwandlung", die getan werden muss, Sie können nur/clr aktivieren und kompilieren. Es wird Build-Fehler geben, aber keine große Anzahl.
Dies ist eine Entscheidung, die nicht leicht getroffen werden sollte. Sobald Sie die Schwelle/clr überschreiten, opfern Sie ein paar Dinge:
Build-Leistung wird viel schlechter, vor allem Verknüpfung. Sie können ein C++/CLR-Projekt nicht inkrementell verknüpfen.
Eine zusätzliche Ladeebene wird zu Ihrer .Exe- oder .Dll hinzugefügt. Vor allem bei der Statik muss auf die Reihenfolge der Initialisierung geachtet werden. Das hat mit VS2005 viel besser gestarrt, aber es gibt immer noch Schluckauf. Ich habe ein/clr-DLL-Projekt, das nicht korrekt entladen und ich konnte nicht herausfinden, warum. Ein Symptom für solche Probleme ist, dass Sie den Speicherleck-Erkennungs-Dumpon-Exit vom Debug nicht erhalten.
Wenn Sie dem Projekt Funktionen hinzufügen, haben Sie die Wahl zwischen einer verwalteten oder nativen Implementierung. Wenn Sie sich für etwas entscheiden, das anderswo im Projekt nativ verwaltet wird, müssen Sie wählen, ob ich die ältere Implementierung überarbeiten möchte.
Das Überschreiten des verwalteten nativen Schwellenwerts hat Auswirkungen auf die Leistung und das Debugging.
Ausnahmebehandlung wird komplizierter.
Anstatt das/clr-Schalter auf ein ganzes Projekt zu spiegeln, empfehle ich einen viel gezielteren Ansatz. Halten Sie Ihre große Bibliothek nativ. Erstellen Sie einen Bootstrapper/Wrapper im gemischten Modus/clr. Dieser "Thin Proxy" bietet den Vorteil des Zugriffs auf Ihre native Bibliothek, während die Stabilität und Leistung der nativen Bibliothek erhalten bleibt.
Wenn Sie Dialoge (oder schlimmer, SDI/MDI-Ansichten, siehe here) in Ihrer nativen Bibliothek haben, kann es schwierig sein, die Anzeige zu verdrahten. Aber es wird sich lohnen.
VC++. Net, wenn ich mich nicht irre, hat eine neue Version von MFC. Konvertieren Sie das Projekt in ein VC.net-Projekt, und konvertieren Sie dann die Klassen langsam in verwalteten Code. Dies gibt Ihnen die Möglichkeit, alles langsam neu zu gestalten, anstatt einen riesigen Sprung, alles neu zu schreiben. Übrigens, wenn Sie die Schnittstelle noch nicht von den internen Arbeiten mit dem MVC-Designmuster getrennt haben.
Nachdem ich mich mit der/clr Flagge bei einem großen Projekt beschäftigt habe, würde ich def. stimme zu, dass die Trennung eines Großteils des systemeigenen Codes in eine DLL der richtige Weg ist. – Nick