estoy tratando de llamar a la siguiente función en C++ que está envuelto en una DLL:¿Cómo puede Marshal una matriz de bytes en C#?
unsigned char * rectifyImage(unsigned char *pimg, int rows, int cols)
Mi declaración de importación tiene el siguiente aspecto:
[DllImport("mex_rectify_image.dll")]
unsafe public static extern IntPtr rectifyImage(
byte[] data, int rows, int columns);
Y mi rutina de llamada tiene el siguiente aspecto:
byte[] imageData = new byte[img.Height * img.Width * 3];
// ... populate imageData
IntPtr rectifiedImagePtr = rectifyImage(imageData, img.Height, img.Width);
Byte[] rectifiedImage = new Byte[img.Width * img.Height * 3];
Marshal.Copy(rectifiedImagePtr, rectifiedImage, 0, 3 * img.Width * img.Height);
Sin embargo, sigo obteniendo un error de ejecución:
Se produjo una primera excepción de tipo System.AccessViolationException
en xxx.dll Se intentó leer o escribir en la memoria protegida. Esto a menudo es una indicación de que otra memoria está corrupta.
Me pregunto si el error radica en la forma en que estoy ordenando mis datos o en mi archivo DLL importado ... ¿alguien tiene alguna idea?
Quizás quiera echar un vistazo a esta pregunta: http://stackoverflow.com/questions/289076/how-can-i-pass-a-pointer-to-an-array-using- p-invoke-in-c – Bobby
Se supone que el valor de retorno de 'rectifyImage' se ha liberado, y si es así, ¿cómo? –
El valor de retorno de rectifyImage se usa para crear un objeto de mapa de bits C#, y luego se libera. No he intentado averiguar cómo liberarlo realmente todavía. – Tim