Nat*_*ael 4 .net c++ c++-cli marshalling
我正在编写一个用C++\CLI编写的托管组件的本机包装器.
我在托管代码中有以下功能:
array<Byte>^ Class::Function();
Run Code Online (Sandbox Code Playgroud)
我想从具有以下签名的本机C++类公开此函数:
shared_array<unsigned char> Class::Function();
Run Code Online (Sandbox Code Playgroud)
我已经从本机代码调用托管函数,但我不确定如何安全地将托管阵列复制到非托管阵列.
gcroot<cli::array<System::Byte>^> managedArray = _managedObject->Function();
Run Code Online (Sandbox Code Playgroud)
通常有两种方法:
使用本机代码执行封送处理,这需要使用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;
}
Run Code Online (Sandbox Code Playgroud)使用托管代码执行封送处理,这需要使用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;
}
Run Code Online (Sandbox Code Playgroud)通常我更喜欢后一种方法,因为如果阵列很大,前者可能会阻碍GC的有效性.