Je suis en train d'appeler la fonction C++ suivante qui est enveloppé dans une DLL:Comment pouvez-vous Marshal un tableau d'octets en C#?
unsigned char * rectifyImage(unsigned char *pimg, int rows, int cols)
Ma déclaration d'importation se présente comme suit:
[DllImport("mex_rectify_image.dll")]
unsafe public static extern IntPtr rectifyImage(
byte[] data, int rows, int columns);
Et ma routine d'appel se présente comme suit:
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);
Cependant, je continue à obtenir une erreur d'exécution:
Une exception de première chance de type System.AccessViolationException
s'est produite dans xxx.dll Vous avez tenté de lire ou d'écrire de la mémoire protégée. C'est souvent une indication que l'autre mémoire est corrompue. Je me demandais juste si la faute réside dans la façon dont je marshaling mes données ou dans mon fichier DLL importé ... quelqu'un a des idées?
Vous voudrez peut-être jeter un oeil à cette question: http://stackoverflow.com/questions/289076/how-can-i-pass-a-pointer-to-an-array-using- p-invoke-in-c – Bobby
La valeur de retour de 'rectifyImage' est-elle censée être libérée, et si oui, comment? –
La valeur de retour de rectifyImage est utilisée pour créer un objet C# Bitmap, puis libérée. Je n'ai pas encore essayé de comprendre comment le libérer. – Tim