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

DDo*_*nko 3 c# c++ unity-game-engine

我正在尝试将原始纹理数据从Texture2D(字节数组)传递到非托管C++ 代码。在 C# 代码中,数组长度约为 1.5kk,但在 C++ 中,“sizeof”始终返回 8。

本机方法的 C# 声明:

[DllImport("LibName", CallingConvention = CallingConvention.Cdecl)]
static extern IntPtr ProcessData(byte[] data);
Run Code Online (Sandbox Code Playgroud)

C++:

extern "C" {
    __declspec(dllexport) void ProcessData(uint8_t *data) {
        //sizeof(data) is always 8
    }
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?有没有一种方法可以在 C++ 代码中传递数组而不需要额外的内存分配?

Pro*_*mer 5

您需要对当前代码执行以下操作:

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

C++:

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