元帅设法对非符号整数进行非托管数组

时间:2019-03-14 15:16:41

标签: c++ c++-cli command-line-interface marshalling

我有托管的无符号整数数组:

array<unsigned int> ^intParams

我有本机函数作为参数:

const unsigned int *intParams

我正在尝试使用Marshal :: Copy,例如:

IntPtr ptr_intParams = Marshal::AllocHGlobal( intParams->Length * sizeof( unsigned int ) );
Marshal::Copy( intParams, 0, ptr_intParams, intParams->Length );

但似乎Marshal :: Copy不支持无符号类型(?)

如何正确地将此托管数组转换为非托管数组?

2 个答案:

答案 0 :(得分:1)

数组转换是C ++ / CLI中的常见问题,因此有一个很好的解决方案:pin_ptr<>。以这种方式使用它:

array<unsigned int> ^intParams;
// code that assigns a managed array to intParams
pin_ptr<unsigned int> intParamsPtr = &intParams [0];
// code that uses intParamsPtr as unsigned int*

请注意,此代码不涉及元素的任何置换。它只是将一个指针指向托管数组的开头并“固定”它,因此在垃圾回收期间无法在内存中四处移动它。幸运的是,有符号,无符号以及任何元素大小的整数数组的布局在托管和非托管方面都是相同的,因此不需要进行元素转换。

固定指针仅在定义它的块中有效。一旦指针超出范围(例如,在大括号闭合之后),指针就会自动变为无效。无需处理指针。

答案 1 :(得分:-1)

好,很简单... 我设法做到了:

std::vector<unsigned int> vec_intParams( intParams->Length );
for ( size_t i = 0; i < vec_intParams.size( ); ++i )
    vec_intParams[i] = intParams[i];

...然后在代码中,当我想使用指针时,我只是这样做:

vec_intParams.data( )