PInvocar error al ordenar estructura con una cadena
-
11-07-2019 - |
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.
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