将字节数组从 Unity C# 传递到 C++ 插件
Pass byte array from Unity C# to C++ plugin
我正在尝试将原始纹理数据从 Texture2D(字节数组)传递到非托管 C++ 代码。在 C# 代码中,数组长度约为 1,5kk,但在 C++ 中 'sizeof' 总是 returns 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。您必须将数组的大小发送到另一个参数中的 C++ 插件,如 UnholySheep 所述。
2。您还必须在将数组发送到 C++ 端之前固定数组。这是通过 fixed
关键字或 GCHandle.Alloc
函数完成的。
3。如果 C++ 函数具有 void return 类型,则您的 C# 函数也应具有 void return 类型。
以下是您的代码的更正版本。没有执行额外的内存分配。
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
}
}
我正在尝试将原始纹理数据从 Texture2D(字节数组)传递到非托管 C++ 代码。在 C# 代码中,数组长度约为 1,5kk,但在 C++ 中 'sizeof' 总是 returns 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。您必须将数组的大小发送到另一个参数中的 C++ 插件,如 UnholySheep 所述。
2。您还必须在将数组发送到 C++ 端之前固定数组。这是通过 fixed
关键字或 GCHandle.Alloc
函数完成的。
3。如果 C++ 函数具有 void return 类型,则您的 C# 函数也应具有 void return 类型。
以下是您的代码的更正版本。没有执行额外的内存分配。
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
}
}