Чтобы использовать управляемую память в собственном коде, сначала необходимо скопировать содержимое управляемой памяти в собственную память.
Так, например:
Копирование содержимого из управляемой памяти выполняется следующим образом:
const int len = 50;
BYTE *destination = new BYTE[nLength];
System::Byte source[] = new System::Byte[len];
System::Runtime::InteropServices::Marshal::
Copy(source, 0, IntPtr((void *)destination, len);
Поскольку мы имеем дело с управляемой памятью, сборщик мусора может перемещать и перемещать управляемые данные в другое место, и все будет потеряно, если мы попытаемся найти данные, которые хотим преобразовать.
Поэтому мы хотим «закрепить его в памяти», используя __pin для преобразования из управляемого в неуправляемый:
const int len = 50;
BYTE *source = new BYTE[len];
System::Byte destination[] = new System::Byte[len];
BYTE __pin *managedData = &(destination[0]);
::memcpy(source, managedData, len);