2 Stimmen

Optionen für das Refactoring von Teilen des Codes weg von nativem C++?

Eine häufig gehörte Bemerkung, wenn es um Leistung geht, ist, dass man seinen Code in der Sprache schreibt, mit der man die Aufgabe am schnellsten erledigen kann. Wenn die Leistung in bestimmten Bereichen ein Problem darstellt, dann schreiben Sie diese Teile in C/C++ um.

Was aber, wenn Sie mit einer nativen C++-Anwendung beginnen? Welche Möglichkeiten haben Sie, wenn Sie die einfachen Teile in einer Sprache wie Python, Ruby, C# oder einer anderen Sprache schreiben oder die alten Teile umgestalten wollen? Denken Sie daran, dass die Übertragung von Daten zwischen der nativen und der anderen Seite ein Muss ist. Es wäre schön, wenn man einfach eine Funktion aufrufen könnte, die in einer "einfacheren" Sprache geschrieben wurde, und dabei C++-Klassen als Daten übergeben könnte.

Wir haben eine verkrustete Win32-Anwendung, die sehr davon profitieren würde, wenn wir neuen Code in C# oder ähnlichem erstellen oder alten Code überarbeiten könnten. Nur sehr wenig davon erfordert die Komplexität von C++, und der Umgang mit den kleinen kniffligen Bits zieht den Programmierprozess in die Länge.

2voto

orj Punkte 12656

Als Aaron Fischer vorschlägt, versuchen Sie, Ihre C++-Anwendung mit aktivierter Option /clr neu zu kompilieren, und nutzen Sie dann die .Net-Plattform.

CLI/C++ ist ziemlich einfach zu erlernen, wenn Sie bereits C# und C++ kennen, und es bildet die Brücke zwischen der .Net-Welt und dem nativen C++.

Wenn Ihr aktueller C++-Code mit aktiviertem /clr nicht sauber kompiliert werden kann, würde ich vorschlagen, dass Sie versuchen, Ihre Anwendung als statische Lib (ohne aktiviertes /clr) zu erstellen und dann Ihr main() in einem CLI/C++-Projekt zu haben, das Ihren Legacy-App-Einstiegspunkt aufruft. Auf diese Weise können Sie zumindest beginnen, .Net für neue Funktionen zu nutzen.

Beispiele für "alte" C/C++-Anwendungen, die auf .Net CLI/C++ "portiert" wurden, finden Sie in den .Net-Portierungen von Quake 2 y Quake 3: Arena .

1voto

Douglas Mayle Punkte 19645

Wenn Sie zwischen C++ und Python arbeiten wollen, dann Boost-Python ist das, wonach Sie suchen. Sie können C-Python-Bindungen für Cython von Hand schreiben, aber das schränkt Sie in vielerlei Hinsicht ein, wie Sie Ihren Code schreiben werden. Dies ist der einfachste Weg, wie man an einigen Schnipseln aus diese Anleitung :

Eine einfache Funktion, die ein "Hallo Welt" ausführt:

char const* greet()
{
   return "hello, world";
}

Der Boost-Python-Code wird benötigt, um ihn für Python freizugeben:

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

Wie man diesen Code in Python verwendet:

>>> import hello_ext
>>> print hello.greet()
hello, world

Der umgekehrte Weg ist etwas schwieriger, da Python nicht zu nativem Code kompiliert werden kann. Sie müssen den Python-Interpreter in Ihre C++-Anwendung einbetten, aber die dafür notwendige Arbeit ist dokumentiert aquí . Dies ist ein Beispiel für den Aufruf des Python-Interpreters und die Extraktion des Ergebnisses (der Python-Interpreter definiert die Objektklasse zur Verwendung in C++):

object result = eval("5 ** 2");
int five_squared = extract<int>(result);

1voto

coppro Punkte 14158

Nun, das hängt wirklich von der Sprache ab. Python-Schnittstelle, zum Beispiel, ist am einfachsten mit Boost Python getan, und viele andere Sprachen müssen Sie sie wie Sie mit C, mit ihrer C-Bibliothek und deklarieren Sie Ihre Rückrufe zu extern "C" (unglücklich, dass Sie nicht die C + + Klassendefinitionen in anderen Sprachen in der Regel verwenden können) Schnittstelle.

Aber ich würde auch fragen, wofür Sie es verwenden wollen, denn C++ ist eine komplexe Sprache, aber wenn man sich mit ihr vertraut gemacht hat, ist sie sehr leistungsfähig und nicht viel schwieriger zu programmieren als andere Sprachen. Die einzige wirklich gute Ausnahme, die mir einfällt, ist, wenn Sie vorhaben, eine leistungsfähige Bibliothek zu verwenden, die nur in einer Sprache existiert, und es keine vernünftige C++-Alternative gibt (Grafikbibliotheken sind wahrscheinlich das beste Beispiel dafür, weil man mit ihnen sehr vertraut sein muss, um sie effektiv zu nutzen).

Es ist auch erwähnenswert, dass Sie, wenn Sie C++-Code in eine andere Sprache einbinden, die plattformübergreifende Kompatibilität, die diese Sprache bietet, nicht nutzen können.

1voto

Aaron Fischer Punkte 20373

Sie können die Laufzeitunterstützung für Common Language in Ihrem C++-Projekt auf /clr ändern. Ab diesem Zeitpunkt können Sie jede .net-Funktionalität direkt in Ihrem C++-Code verwenden. Dazu gehört auch das Erstellen von Winforms in Ihrem Projekt. Sie können auch eine c#-Bibliothek hinzufügen, die die Benutzeroberfläche und andere Funktionen behandelt.

0voto

Ash Punkte 58914

In der .NET-Welt haben Sie immer die Möglichkeit, eine COM/ActiveX-Interop-Schicht für Ihre C#/VB.NET-Assembly zu erstellen.

Sie können dann die normale COM-API aus Ihrer C++-Anwendung verwenden, um eine Instanz dieses COM-Servers zu erstellen, die Ihre .NET-Assembly umschließt.

Das Gute daran ist, dass einfache Parameter wie int, bool, string, float usw. auf ihre COM-Entsprechung abgebildet werden. Meines Wissens ist es jedoch nicht möglich, vollständige .NET-Objekte (Instanzen von Klassen, die Sie erstellen) zu übergeben.

Beachten Sie auch, dass COM-Interop-Aufrufe relativ langsam sind. Sie sollten eine COM-Interop-Methode nicht ständig von Ihrem C++-Code in einer engen Schleife aufrufen.

COM/ActiveX haben sich traditionell auf die Windows-Registrierung verlassen, was nicht ideal ist, da es eine große Abhängigkeit darstellt. Es ist jedoch auch möglich, Folgendes zu verwenden Registrierungsfrei COM-Interop, um diese Abhängigkeit zu vermeiden.

Dieser Artikel behandelt die Schritte, die erforderlich sind, um eine .NET-Assembly für COM-Interop zu registrieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X