我正在编写一个用C ++ \ CLI编写的托管组件的本机包装器。
我在托管代码中有以下功能:
array<Byte>^ Class::Function();
我想从具有以下签名的本机C ++类公开此函数:
shared_array<unsigned char> Class::Function();
我已经从本机代码调用托管函数了,但我不确定如何安全地将托管阵列复制到非托管代码中。
gcroot<cli::array<System::Byte>^> managedArray = _managedObject->Function();
答案 0 :(得分:6)
通常有两种方法:
使用本机代码执行封送处理,这需要使用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的有效性。
答案 1 :(得分:0)
看看pin_ptr
,它允许您将托管类的地址传递给非托管函数。