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.

War es hilfreich?

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
scroll top