Pregunta

Tengo una estructura C ++

struct UnmanagedStruct
{
   char* s;
   // Other members
};

y una estructura C #

struct ManagedStruct {
   [MarshalAs(UnmanagedType.LPStr)]
   string s;
   // Other members
}

la biblioteca de C ++ expone

extern "C" UnmanagedStruct __declspec(dllexport) foo( char* input );

Y se importa como

  [DllImport("SomeDLL.dll", CharSet = CharSet.Ansi)]
  static extern ManagedStruct foo( string input );

Sin embargo, cuando llamo a esta función obtengo

MarshalDirectiveException no se manejó

La firma de tipo del método no es compatible con PInvoke.

La cuestión es que esta llamada a función funciona si elimino los caracteres char * sy la cadena s de las estructuras.

¿Fue útil?

Solución

Para este tipo de escenario, no use una cadena directamente. En su lugar, cambie el tipo para que sea un valor IntPtr y use Marshal.PtrToStringAuto / Ansi / Uni según corresponda. En este caso, dado que su código nativo usa char * , PtrToStringAnsi es la mejor opción.

struct ManagedStruct {
  IntPtr s;
  public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top