将字节数组从Unity C#传递到C ++插件

时间:2017-10-02 14:24:02

标签: c# c++ unity3d unity5

我试图将纹理数据从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 个答案:

答案 0 :(得分:3)

您需要对当前代码执行的操作很少:

1 。您必须将数组的大小发送到另一个参数中的C ++插件,如UnholySheep所述。

2 。您还需要在将数组发送到C ++端之前将其固定。这是通过$digest is already running关键字或fixed函数完成的。

3 。如果C ++函数有一个void返回类型,你的C#函数也应该有void返回类型。

以下是您的代码的更正版本。不执行额外的内存分配。

C#:

GCHandle.Alloc

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