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

标签 c# c++ unity3d

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

native 方法的 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
    }
}

关于c# - 将字节数组从 Unity C# 传递到 C++ 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47591330/

相关文章:

c# - 性能 - 在使用 foreach 循环之前检查列表是否为空

c# - 可以使光线转换仅检测物体的侧面吗?

c++ - 如何在MFC中的CArray中使用CArray?

javascript - 图像上传到 Summernote 编辑器中的文件夹

c# - 使用 C# 和存储过程解析文本文件并将其加载到数据库中

c# - Minecraft 1.6.2 自定义启动器

c++ - 如何在 visual studio 2010 express 中将 cpp 编译为 dll

c++ - 为 main() 返回不同的 int 值

c# - 动画状态..无法播放是因为找不到?

c# - 我如何强制使用 exe 构建 DLL,以便只有一个文件?