.NET String als Rückgabewert - Was tun in C++?

oliver87

Grünschnabel
Hallo Leute,

ich habe in VB.NET eine DLL geschrieben. Alles funktioniert soweit.

Nun möchte ich aus der VB.NET DLL eine Funktion mit Rückgabewert aufrufen. Der Rückgabewert sollte eine Zeichenkette, sprich ein String sein.

Leider kann damit C++ nichts anfangen, ebenso wenig wie ich...

Was für einen Datentyp gibt es in C++ für den String?

Ich sollte vielleicht dazu erwähnen, dass ich nur minimal Kenntnisse in C++ besitze.

Ich hoffe Ihr könnt mir weiterhelfen!

Gruß Oliver87
 
C++ .... in .net? Dann haste keine Probleme.

Für Win32 musst Du über Com gehen. Also Interface schreiben, Klasse signieren und dann über Typenbibliothek (codebase / gac) registrieren und in Win32 C++ wieder über Com laden.

Schau bei .net mal unter InterOpService

Chris
 
Oder du schreibst den C++ Teil in C++/CLI. (entsprechende cpp Module mit dem /clr Switch kompilieren)

.NET Strings werden in C++ üblicherweise mit einem wchar_t Array repräsentiert.

C++/CLI kann sowohl mit C++ wie auch mit .NET Datentypen umgehen. Der Namespace System.Runtim.InteropServices und die Headerdatei vcclr.h helfen dabei.

[MSDN] How to: Marshal Unicode Strings Using C++ Interop

Wichtig dabei ist, dass du direkt auf den Speicher des Strings zugreifst und dieser daher 'gepinnt' werden muss damit der Garbage Collector den String nicht verschiebt. Im MSDN-Codebeispiel geschieht dies durch die Verwendung des pin_ptr Templates. Sobald die Kontrolle aber die main() Funktion im MSDN-Beispiel verlässt, wird dieser sogenannte "pinning pointer" zerstört und der GC kann den String nach Belieben verschieben. Alle wchar_t Zeiger könnten also ab dem Punkt auf etwas völlig anderes zeigen.

Für dieses Problem gibt es zwei Lösungen:

Den pinning pointer für immer behalten
Sieht zwar bequem aus, legt aber dem GC "Steine" in den Weg. Je mehr Speicher gepinnt wird, desto öfter muss der GC den Rest umordnen oder mehr Speicher vom Betriebssystem verlangen.

Eine Kopie des Strings in manuell verwaltetem Speicher erstellen
Hier kann man den Speicher-Pin sofort wieder entfernen. Bitte beachten, dass wir hier von einer Kopie des Strings und nicht nur der Referenz sprechen (vorallem wenn die Grösse deiner Strings in Megabyte gemessen werden).
 
Zurück