2017-10-02 1 views
2

J'essaie de transmettre des données de texture brutes de Texture2D (tableau d'octets) au code C++ non managé. En C# longueur du tableau de code est environ 1,5kk, mais en C++ 'sizeof' retourne toujours 8.Passer un tableau d'octets de Unity C# à C++

C# déclaration de méthode native:

[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 
    } 
} 

Que suis-je mal faire? Est-il possible de transmettre un tableau sans allocation de mémoire supplémentaire dans le code C++?

+2

'sizeof (données)' vous indique la taille du ** pointeur **, vous ne pouvez pas déduire la taille de la pointé vers un tableau à partir d'un pointeur, vous devez le passer séparément – UnholySheep

Répondre

2

Peu de choses que vous devez faire avec votre code actuel:

.Vous avez envoyer la taille du tableau du plug-in C++ dans un autre paramètre comme UnholySheep mentionné.

. Vous devez également épingler le tableau avant de l'envoyer du côté C++. Ceci est fait avec le mot-clé fixed ou la fonction GCHandle.Alloc. Si la fonction C++ a un type de retour void, votre fonction C# doit également avoir le type de retour void.

Vous trouverez ci-dessous une version corrigée de votre code. Aucune allocation de mémoire supplémentaire n'est effectuée.

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 
    } 
}