Frage

Meine gesamte Anwendung (die ziemlich groß ist, mit einer 20 -MB -ausführbaren Datei) ist in nicht verwaltetem C ++ geschrieben. Da ich die Vorteile bei der Verwendung von Managed Code deutlich sehen kann, möchte ich mit der Einführung von Managed Code in meine Anwendung beginnen, aber wo fange ich an?

Kann ich leicht anfangen, C ++/CLI zu verwenden und es mit dem Rest meiner Anwendung zu verknüpfen? (Obwohl die C ++/CLI -Syntax eher "exotisch" erscheint).

Oder ist es besser, zu C#zu wechseln, aber was ist der beste Weg, dies zusammen mit meinem nicht verwalteten C ++ - Code zu verknüpfen?

Ist es sinnvoll, meinen gesamten C ++ - Code mit der Option /CLR zu kompilieren? Ob das funktioniert?

Muss ich mir Sorgen um das Marshalling machen? Gibt dies einen Overhead oder kann ich ohne Leistungsstrafe zwischen verwaltet und nicht verwaltet wechseln (genau wie vor 20 Jahren beim Mischen von Fortran und C). Leistung ist in meiner Anwendung wirklich wichtig, da es sich um eine wissenschaftliche Anwendung handelt, die manchmal mehrere Gigabyte des Speichers verarbeitet.

Oder ist es nur sinnvoll, die Benutzeroberfläche neu zu gestalten und diese nur in C#zu schreiben und den Rest meiner Anwendung (Berechnungslogik, Geschäftslogik, Datenbankschnittstelle, ...) in nicht verwaltetem C ++ zu behalten?

Da meine Anwendung manchmal mehrere Gigabyte Speicher abwickeln muss, habe ich eine 64-Bit-Variante. Ist es einfach, einen 64-Bit-Code zu haben? Wenn der Müllsammler immer noch effizient ist, wenn so viel Speicher verwendet wird?

Einfach angeben: Wo fange ich an?

Patrick

War es hilfreich?

Lösung 3

Betrachten Sie diese Frage für den Moment geschlossen.

Mir wurde klar, dass die Antwort nicht C ++ und C#mischt, sondern die Architektur in erster Linie richtig macht.

Wenn die Architektur korrekt ist und dort getrennt ist, wo sie getrennt werden muss, sollte das Ändern der Teile der Anwendung durch andere Module (extern, andere Sprache, ...) einfacher sein.

In Bezug auf die Leistungsprobleme während des Marshalle müssen wir warten, bis .NET weiter gereift ist.

Andere Tipps

Profilieren Sie die App, entscheiden Sie, welche Integrationspunkte Sie die C# Logic -Zeile ausschalten und in C ++ einbrechen und umgekehrt. Ordnen Sie diese in einen Plan ein, damit sich ein Fassadendesign -Muster durch das System bewegen kann und C ++ allmählich durch C#ersetzt. Aus wichtigem Anliegen sind die CPU- und Speicherkosten bei der Entscheidung, die Sprachen an jeder Kandidatenfassade / -schnittstelle zu wechseln.

Sie möchten in der Lage sein, Änderungen zu integrieren, damit Sie möglicherweise am besten mit einem Quellcode -Set und dem Quellcode -Repository für den ursprünglichen C ++ - Code und ein anderes Set und ein Repository für die Fassade plus C#abgeschlossen sind.

Wenn die Verbesserungen/Wartungsarbeiten in dem In-Traum einhergehen, wenden Sie ihn auf beide Codebasen an und versuchen, sicherzustellen .

Strukturieren Sie auch im Idealfall Ihre Arbeit, damit Sie die Fassade im Tropfen eines Hutes auf 100% C ++ zurückkehren können, wenn Sie einen Haken treffen.

Um zu testen, ob ein paar besonders unergründliche C ++ - Module in ein C ++ - Stück und ein C# -Teil getrennt werden können, führen Sie sie in zwei verschiedenen Win32 -C ++ -Prozessen aus, die mithilfe eines Rohrs oder einer Steckdose kommunizieren. Auf diese Weise erhalten Sie eine bessere Vorstellung davon, ob es Probleme mit dem Speichermanagement oder der Leistung gibt, die behoben werden müssen, bevor Sie die Call -Kette zu diesem Zeitpunkt teilen können.

Wir tun genau das, was Sie in einer geschäftskritischen Anwendung beschrieben haben, die von Tausenden von Benutzern verwendet wird. Grundsätzlich haben wir die vorhandene Anwendung so aufbewahrt, so dass die ausführbare Datei immer noch eine 100% ige nicht verwaltete ausführbare Datei (nicht C ++/CLI) ist. Anschließend setzen wir alle unsere neuen C# -Codes in .NET -DLLs ein, die aus Geschäftsobjekten, Benutzerkontrollen und GUI -Code usw. besteht.

Grundsätzlich ist der gesamte neue Code in C#geschrieben. Wir haben 1 DLL, das C ++/Cli ist, der nur Kleber ist. Dadurch können wir leicht zwischen dem verwalteten und nicht verwalteten Code interoperieren, ohne den vorhandenen C ++ - Code CLR erstellen zu müssen. Dies begrenzt die Menge an C ++/CLI -Code, die wir schreiben müssen. Der native Code spricht mit dem gemischten Modus -Code, der mit dem verwalteten Code sprechen kann. Der gemischte Modus -DLL kann Ereignisse an den C# -Klasses anschließen, damit der C# -Code das Ereignis einfach mit dem C ++/CLI vermitteln kann (was mit dem nativen Code sprechen kann).

Wir können auch .NET UserControls in einer vorhandenen C ++ - App moderieren (WinForms ist sowieso nur ein Wrapper um den WinAPi, also funktioniert es ziemlich gut).

Dies funktioniert sehr gut und ermöglicht es Ihnen, Ihren vorhandenen Code zu behalten, ohne die gesamte GUI in C#umschreiben zu müssen.

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