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

3

我将尝试将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++代码中传递数组而无需额外内存分配的方法?

2
sizeof(data) 告诉你指针的大小,但你无法从指针中推断出所指向的数组的大小,你需要单独传递它。 - UnholySheep
1个回答

5

以下是需要对您现有代码进行的几项操作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接