如何将cli::数组从本机代码转换为本机数组
How do I convert a cli::array to a native array from native code?
我正在为一个用c++ CLI编写的托管组件编写一个本机包装器。
我在托管代码中有以下功能:
array<Byte>^ Class::Function();
我想从本地c++类中公开这个函数,并使用以下签名:
shared_array<unsigned char> Class::Function();
我已经从本机代码调用托管函数,但我不确定如何安全地将托管数组复制到非托管数组。
gcroot<cli::array<System::Byte>^> managedArray = _managedObject->Function();
通常有两种方法:
-
使用本机代码执行封送处理,这需要使用
pin_ptr<>
:boost::shared_array<unsigned char> convert(array<unsigned char>^ arr) { boost::shared_array<unsigned char> dest(new unsigned char[arr->Length]); pin_ptr<unsigned char> pinned = &arr[0]; unsigned char* src = pinned; std::copy(src, src + arr->Length, dest.get()); return dest; }
-
使用托管代码执行封送处理,这需要使用Marshal类:
boost::shared_array<unsigned char> convert(array<unsigned char>^ arr) { using System::Runtime::InteropServices::Marshal; boost::shared_array<unsigned char> dest(new unsigned char[arr->Length]); Marshal::Copy(arr, 0, IntPtr(dest.get()), arr->Length); return dest; }
一般来说,我更喜欢后一种方法,因为如果数组很大,前者可能会阻碍GC的有效性。
看看pin_ptr
,它允许您将托管类的地址传递给非托管函数
相关文章:
- 如何在C++中将数组转换为矢量指针
- 将C++中的数组转换为字符串
- NLOHMANN 的 JSON 库将数组转换为结构向量
- 将 int 数组转换为 std::vector<int*>
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- 将字节数组转换为带有字节序问题的指针
- 使用 stbi_write_png,如何将 0 和 1 的矩形字节数组转换为单色 png 文件?
- 将字符数组转换为时间结构
- 将字节数组转换为多维数组
- 可视化 如何在C++中将字符数组转换为 FILE 类型
- 在 C++ 中将整数数组转换为位集表示形式的最佳方法?
- C++如何将字符数组转换为字节向量(向量<byte>)
- 将字符数组转换为结构时出现问题. 结构的字符数组变量溢出
- 无法将字符数组转换为包含 utf-8 字符的字符串
- 如何使用 C++将 2D RGB 数组转换为 dds 文件?
- 如何将字符串指针数组转换为字符串类型的智能指针向量?
- 将 int 数组转换为带有小数C++的双精度数组
- 使用 .data() 将字符数组转换为 std::string 不会转换整个数组
- 将字符数组转换为整数值