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++ 代码中传递数组而不需要额外的内存分配?
您需要对当前代码执行以下操作:
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)
| 归档时间: |
|
| 查看次数: |
2920 次 |
| 最近记录: |