将一个字节数组从Unity C#传递到C++库方法中
Passing a byte array from Unity C# into a C++ library method
我有一个C++库方法,我想从Unity C#脚本中调用它。
我知道有三个关键步骤。首先,将C++方法声明为extern "C"
。其次,在相应的C#外部方法声明之前使用[DllImport('foobar')]
。第三,用lib前缀(例如libfoobar.so
)命名库文件,并将其放在Unity插件文件夹中。
到目前为止一切都很好——如果我只是将简单的参数类型(如int
)从C#传递到C++中。然而,要传递byte[]
参数,我需要考虑C#和C++处理内存和指针的不同方式。我还没有找到一个明确的例子来说明应该如何做到这一点。
我的问题是:如何将Unity C#脚本中的byte[]
传递到外部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
调用,并确保在库不再需要访问内存后删除内存。
适用于我:
统一:
[DllImport ("dllplugin")]
public static extern void Method (byte[] bytes);
在c++插件中
#define EXPORT_API __declspec(dllexport)
extern "C" void EXPORT_API Method(unsigned char* bytes)
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 初始化具有非默认构造函数的std::数组项的更好方法