将字节数组从Unity C#传递到C ++插件
我正在尝试将Texture2D(字节数组)中的原始纹理数据传递给非托管C ++代码。 在C#代码中,数组长度约为1.5kk,但在C ++中,“sizeof”总是返回8。
本机方法的C#声明:
[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 } }
我究竟做错了什么? 有没有办法在C ++代码中传递数组而无需额外的内存分配?
您当前的代码需要做的事情很少:
1.你必须像UnholySheep所提到的那样,将数组的大小发送到另一个参数中的C ++插件。
2.在将数组发送到C ++端之前,还必须将数组固定。 这是使用fixed
关键字或GCHandle.Alloc
函数完成的。
3.如果C ++函数具有void返回类型,则C#函数也应该具有void返回类型。
以下是您的代码的更正版本。 不执行额外的内存分配。
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 } }