gpt4 book ai didi

c# - 将字节数组从 Unity C# 传递到 C++ 库方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:34 25 4
gpt4 key购买 nike

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

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

到目前为止一切顺利——如果我只是将简单的参数类型(如 int)从 C# 传递到 C++。但是,要传递 byte[] 参数,我需要考虑 C# 和 C++ 处理内存和指针的不同方式。我还没有找到一个明确的例子来说明如何做到这一点。

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

最佳答案

您必须更改方法定义以采用 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);
}

}
}

请注意,您必须使用 Marshal.FreeHGlobal 手动释放非托管内存。此后内存不再有效,因此 C++ 库不能再使用它。如果稍后需要访问数组,请删除 FreeHGlobal 调用,并确保在库不再需要访问它后删除内存。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com