Was ist der beste Weg zur Änderung eines C++ - Programms mit pInvoke von C# .NET CF verwendet werden?C#/C++ pInvoke Tipps
Ich habe eine große C++ Codebasis, die umfangreiche Verwendung von STL. Nämlich Iteratoren, Container-Klassen und Standard-Strings.
Obendrein werden viele leichte Klassen wertmäßig weitergegeben.
Ich möchte eine C# -Anleitung von dieser Codebasis für Windows Mobile Touch-Geräte erstellen.
Ist es das wert?
Ich habe es geschafft, einige Beispiele mit pInvoke zum Aufruf von C++ - Code aus C# .NET zu bekommen, aber das Schreiben von Wrappern für jeden Zugriffspunkt und für alle STL-Rückgabetypen scheint sehr entmutigend und hässlich zu sein. Gibt es einen anderen Weg oder bin ich etwas ausgestopft?
BTW. Managed C++ ist keine Option, da es von .NET CF in keiner Form unterstützt wird.
--edit: Ich habe eine spezifische Frage in Bezug auf Pinvoke.
Angenommen, Sie eine C++ Zeichenfolge nach Wert eine Funktion hatten
Rückkehrstd::string foo() {
return std::string ("Hi");
}
Ich verstehe, dass es nicht möglich, diese Funktion von C# pinvoke verwenden zu nennen, weil es keine Möglichkeit, marshall der STL-String ist, aber mein Problem ist, dass ich nicht einmal einen Wrapper schreiben kann, ohne ein neues Array zuzuweisen, weil die zurückgegebene std :: string nicht auf dem Heap ist.
char* foo2() {
return foo().c_str(); //Very bad
//the returned pointer is released when the std::string falls out of scope.
//and will be invalid before the caller is able to do anything with it.
}
Also mein Problem ist, wie foo in ein pinvoke geeignetes Format wickeln, ohne dass die gesamte Zeichenfolge neu zuordnen.
char* foo2() {
std::string f = foo();
char* waste = new char[f.length()+1];
strcpy (waste, f.c_str());
return f;
}
Der Gedanke für jeden Punkt der oben tun, an das ich brauche eine std :: string zurückzukehren ist genug, um mich versuchen, geben zu bilden C# zu verwenden.
Danke für die Tipps, obwohl ich nicht sicher bin, welche Option 3 bedeutet. Ich stimme zu, dass meine Schnittstelle zu breit war und ich die Brücke zwischen C# und C++ so klein wie möglich machen sollte. Derzeit werden sogar Iteratorreferenzen zurückgegeben, die jedes Mal, wenn sie sich selbst inkrementieren oder dereferenzieren, einen Pinvoke-Aufruf erfordern ... eek. – Akusete
Option 3: Sie erstellen eine Anwendung (exe), die im Hintergrund ausgeführt wird (sie kann entweder die gesamte Zeit ausführen oder vom GUI-Frontend gestartet und gestoppt werden) und kommuniziert mit Ihrer Front-End-Anwendung (GUI) über eine API Sie machen es wie Shared Memory oder Message Queues oder was auch immer Sie mögen. Sortieren Sie wie Win32-Dienste. Ihre Hintergrundanwendung würde normalerweise in einer Art von Ereignisschleife Befehle empfangen und sie verarbeiten. –