PInvoke Fehler, wenn sie mit einer Schnur in ihm Rangier struct
-
11-07-2019 - |
Frage
Ich habe ein C ++ struct
struct UnmanagedStruct
{
char* s;
// Other members
};
und ein C # struct
struct ManagedStruct {
[MarshalAs(UnmanagedType.LPStr)]
string s;
// Other members
}
die C ++ Bibliothek entlarvt
extern "C" UnmanagedStruct __declspec(dllexport) foo( char* input );
Und es wird importiert wie
[DllImport("SomeDLL.dll", CharSet = CharSet.Ansi)]
static extern ManagedStruct foo( string input );
Allerdings, wenn ich diese Funktion aufrufen, ich
MarshalDirectiveException wurde nicht behandelt
Methode des Typs Unterschrift ist nicht PInvoke kompatibel.
Die Sache ist, dieser Funktionsaufruf funktioniert, wenn ich die char * s und die String s aus dem structs entfernen.
Lösung
Für diese Art von Szenario keinen String direkt verwenden. Statt den Typ Schalter einen IntPtr Wert und verwenden Marshal.PtrToStringAuto / ANSI / Uni als angemessen. In diesem Fall, da Ihr nativen Code char*
verwendet, ist PtrToStringAnsi die beste Wahl.
struct ManagedStruct {
IntPtr s;
public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow