Estoy tratando de escribir algún código C# que invoque un método desde una DLL no administrada. El prototipo de la función en la DLL es:PInvoke para la función C que devuelve char *
extern "C" __declspec(dllexport) char *foo(void);
En C#, utilizó por primera vez:
[DllImport(_dllLocation)]
public static extern string foo();
Parece que funciona en la superficie, pero estoy recibiendo errores de corrupción de memoria en tiempo de ejecución. Creo que estoy apuntando a la memoria que pasa a ser correcta, pero que ya ha sido liberada.
Intenté usar una utilidad de código gen PInvoke llamada "P/Invoke Interop Assistant". Me dio la salida:
[System.Runtime.InteropServices.DLLImportAttribute(_dllLocation, EntryPoint = "foo")]
public static extern System.IntPtr foo();
¿Es esto correcto? Si es así, ¿cómo convierto este IntPtr a una cadena en C#?
Esto funcionó para mí. El único cambio que tuve que hacer fue 'PtrToStringAuto' para' PtrToStringAnsi'; de lo contrario, obtuve algunos caracteres chinos – 3vts