如何将 cli::array 从本机代码转换为本机数组?

发布于 2024-12-09 20:41:36 字数 403 浏览 1 评论 0 原文

我正在围绕用 C++\CLI 编写的托管组件编写本机包装器。

我在托管代码中有以下函数:

array<Byte>^ Class::Function();

我想从具有以下签名的本机 C++ 类公开此函数:

shared_array<unsigned char> Class::Function();

我已经从本机代码调用托管函数,但我不确定如何安全地复制将托管数组转换为非托管数组。

gcroot<cli::array<System::Byte>^> managedArray = _managedObject->Function();

I'm writing a native wrapper around a managed component written in C++\CLI.

I have the following function in managed code:

array<Byte>^ Class::Function();

I want to expose this function from a native C++ class with the following signature:

shared_array<unsigned char> Class::Function();

I've gotten as far as calling the managed function from native code, but I'm not sure how to safely copy the managed array into an unmanaged one.

gcroot<cli::array<System::Byte>^> managedArray = _managedObject->Function();

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

寂寞笑我太脆弱 2024-12-16 20:41:36

有两种常用方法:

  1. 使用本机代码执行封送处理,这需要使用 pin_ptr

     boost::shared_array;转换(数组<无符号字符>^ arr)
     {
         boost::shared_array<无符号字符> dest(新的无符号字符[arr->长度]);
         pin_ptr<无符号字符>;固定= &arr[0];
         unsigned char* src = 固定;
         std::copy(src, src + arr->Length, dest.get());
         返回目的地;
     }
    
  2. 使用托管代码执行封送处理,这需要使用 Marshal 类:< /p>

     boost::shared_array;转换(数组<无符号字符>^ arr)
     {
         使用 System::Runtime::InteropServices::Marshal;
    
         boost::shared_array<无符号字符> dest(新的无符号字符[arr->长度]);
         Marshal::Copy(arr, 0, IntPtr(dest.get()), arr->Length);
         返回目的地;
     }
    

通常我更喜欢后一种方法,因为如果数组很大,前者会阻碍 GC 的效率。

There are two usual approaches:

  1. Perform the marshaling with native code, which requires use of 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;
     }
    
  2. Perform the marshaling with managed code, which requires use of the Marshal class:

     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;
     }
    

Generally I would prefer the latter approach, as the former can hinder the GC's effectiveness if the array is large.

没︽人懂的悲伤 2024-12-16 20:41:36

看看 pin_ptr,它允许您将托管类的地址传递给非托管函数。

Take a look at pin_ptr, it lets you pass address of a managed class to an unmanaged function.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文