将Unity C#中的字节数组传递给C++库方法

Gho*_*r21 6 c# c++ mono bytearray unity-game-engine

我有一个C++库方法,我想从Unity C#脚本调用.

我知道有三个关键步骤.首先,声明C++方法extern "C".二,[DllImport('foobar')]在相应的C#extern方法声明之前使用.第三,使用lib前缀(例如libfoobar.so)命名库文件并将其放在Unity插件文件夹中.

到目前为止一切都那么好 - 如果我只是将简单的参数类型int从C#传递到C++中.但是,要传递byte[]参数,我需要考虑C#和C++处理内存和指针的不同方式.我无法找到一个如何做到这一点的明确例子.

我的问题:如何将byte[]Unity C#脚本传递给外部C++库方法?

Erw*_*win 5

您必须更改方法定义才能采用IntPtr。这是定义非托管内存的指针的C#方法。要创建此指针,请使用Marshal.AllocHGlobal(),然后使用将数据复制到该指针Marshal.Copy()

示例(未经测试):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace Assets.Scripts
{
    public class DLLCall
    {

        [DllImport("thedll")]
        public static extern void TheCall(IntPtr byteArray, int size);

        public void PerformCall(byte[] data)
        {
            IntPtr unmanagedArray = Marshal.AllocHGlobal(data.Length);
            Marshal.Copy(data, 0, unmanagedArray, data.Length);

            TheCall(unmanagedArray, data.Length);

            Marshal.FreeHGlobal(unmanagedArray);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您必须使用手动释放非托管内存Marshal.FreeHGlobal。此后,内存将不再有效,因此C ++库将无法再使用它。如果以后需要访问该阵列,请删除该FreeHGlobal调用,并确保在该库不再需要对其进行访问之后删除该内存。


小智 5

为我工作:

统一地:

[DllImport ("dllplugin")]
public static extern void Method (byte[] bytes);
Run Code Online (Sandbox Code Playgroud)

在c ++插件中

#define EXPORT_API __declspec(dllexport)

extern "C" void EXPORT_API Method(unsigned char* bytes)
Run Code Online (Sandbox Code Playgroud)