sto cercando di chiamare la seguente funzione C++ che è avvolto in una DLL:Come si può Marshal un array di byte in C#?
unsigned char * rectifyImage(unsigned char *pimg, int rows, int cols)
La mia dichiarazione di importazione è simile al seguente:
[DllImport("mex_rectify_image.dll")]
unsafe public static extern IntPtr rectifyImage(
byte[] data, int rows, int columns);
E la mia routine di chiamata è simile al seguente:
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);
Tuttavia, continuo a ricevere un errore di runtime:
Si è verificata una prima eccezione di tipo System.AccessViolationException
in xxx.dll Tentativo di leggere o scrivere memoria protetta. Questo è spesso un'indicazione che un'altra memoria è corrotta.
Mi chiedo solo se il problema sta nel modo in cui eseguo il marshalling dei miei dati o nel mio file DLL importato ... qualcuno ha qualche idea?
Si potrebbe dare un'occhiata a questa domanda: http://stackoverflow.com/questions/289076/how-can-i-pass-a-pointer-to-an-array-using- p-invoke-in-c – Bobby
Il valore restituito da 'rectifyImage' dovrebbe essere liberato e, in caso affermativo, come? –
Il valore di ritorno per rectifyImage viene utilizzato per creare un oggetto Bitmap C# e quindi liberato. Non sono riuscito a cercare di capire come effettivamente liberarlo ancora. – Tim