Вы хотите использовать закрепляющий указатель на управляемый массив. Это зафиксирует массив в памяти (то есть сделает так, чтобы сборщик мусора не мог его переместить), а затем вы можете рассматривать его как собственный массив. Ниже приведен пример использования ваших методов.
Обратите внимание, что вам нужно завершить использование массива, прежде чем указатель закрепления выйдет из области видимости - как только указатель закрепления выйдет из области видимости, управляемый массив больше не закрепляется, и сборщик мусора может свободно перемещать массив.
Также обратите внимание, что закрепление первого элемента массива приводит к закреплению всего управляемого массива (обычно использование указателя закрепления на одной части управляемого объекта приводит к закреплению всего управляемого объекта).
template <class It> int Calculate(It beg, It end)
{
int sum = 0;
for (; beg != end; ++beg)
{
int i = *beg;
sum += i;
}
return sum;
}
int DoSomething(cli::array<int>^ values)
{
int numValues = values->Length;
pin_ptr<int> pNativeValuesBegin = &values[0];
int * pBegin = pNativeValuesBegin;
int * pEnd = pBegin + numValues;
return Calculate(pBegin, pEnd);
}
int main(array<System::String ^> ^args)
{
array<int> ^ values = gcnew array<int> { 1, 2, 3, 4, 5 };
int sum = DoSomething(values);
System::Console::WriteLine(sum);
return 0;
}