Was ist der beste Weg, um ein C++-Programm so zu ändern, dass es mit pInvoke von C#.NET CF verwendet werden kann?
Ich habe eine große C++-Codebasis, die ausgiebig Gebrauch von STL macht. Nämlich Iteratoren, Container-Klassen und Standard-Strings.
Darüber hinaus werden viele leichtgewichtige Klassen als Wert weitergegeben.
Ich möchte eine C#-GUI auf dieser Codebasis für Windows Mobile Touch-Geräte erstellen.
Ist es das wert?
Ich habe es geschafft, einige Beispiele arbeiten mit pInvoke C++-Code von C#.NET aufrufen, aber das Schreiben von Wrappern für jeden Zugriffspunkt und für alle STL-Rückkehrtypen scheint sehr entmutigend und hässlich. Gibt es einen anderen Weg, oder bin ich etwas ausgestopft?
ÜBRIGENS. Managed C++ ist keine Option, da es in keiner Form von .NET CF unterstützt wird.
--edit: Ich habe eine spezielle Frage in Bezug auf pinvoke.
Angenommen, Sie haben eine Funktion, die eine C++-Zeichenkette als Wert zurückgibt
std::string foo () {
return std::string ("Hi");
}
Ich verstehe, dass seine nicht möglich, diese Funktion von C# mit pinvoke aufrufen, weil es keine Möglichkeit, die STL-Zeichenfolge zu marshall, 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.
}
Mein Problem ist also, wie man foo in ein pInvoke-geeignetes Format verpacken kann, ohne die gesamte Zeichenfolge neu zuordnen zu müssen.
char* foo2 () {
std::string f = foo();
char* waste = new char[f.length()+1];
strcpy (waste, f.c_str());
return f;
}
Der Gedanke, dass ich das oben genannte für jeden Punkt tun muss, an dem ich einen std::string zurückgeben muss, ist genug, um mich dazu zu bringen, den Versuch aufzugeben, C# zu verwenden.