Passa array di byte da Unity C # a plugin C ++

Sto provando a passare i dati di texture grezza da Texture2D (array di byte) a codice C ++ non gestito. In codice C # la lunghezza dell’array è di circa 1,5kk, tuttavia in C ++ ‘sizeof’ restituisce sempre 8.

Dichiarazione C # del metodo nativo:

[DllImport("LibName", CallingConvention = CallingConvention.Cdecl)] static extern IntPtr ProcessData(byte[] data); 

C ++:

 extern "C" { __declspec(dllexport) void ProcessData(uint8_t *data) { //sizeof(data) is always 8 } } 

Che cosa sto facendo di sbagliato? C’è un modo per passare array senza allocazione di memoria aggiuntiva nel codice C ++?

Poche cose che devi fare con il tuo codice attuale:

1. Devi inviare la dimensione della matrice al plugin C ++ in un altro parametro come menzionato UnholySheep .

2. Devi anche pin l’array prima di inviarlo al lato C ++. Questo viene fatto con la parola chiave fixed o la funzione GCHandle.Alloc .

3 .Se la funzione C ++ ha un tipo di reso vuoto, la funzione C # dovrebbe avere anche il tipo restituito vuoto.

Di seguito è riportata una versione corretta del codice. Non viene eseguita alcuna allocazione di memoria aggiuntiva.

C #:

 [DllImport("LibName", CallingConvention = CallingConvention.Cdecl)] static extern void ProcessData(IntPtr data, int size); public unsafe void ProcessData(byte[] data, int size) { //Pin Memory fixed (byte* p = data) { ProcessData((IntPtr)p, size); } } 

C ++:

 extern "C" { __declspec(dllexport) void ProcessData(unsigned char* data, int size) { //sizeof(data) is always 8 } }