我正在尝试将原始纹理数据从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
    }
}

08-27 21:33
查看更多