2013-03-24 3 views
5

Для выделения памяти в управляемом коде я использую:Как выделить массив IntPtr [] в неуправляемой памяти?

IntPtr [] params_list_n = new IntPtr [5]; 

Но для неуправляемой памяти я использую Marshal.AllocHGlobal И я не понимаю, как в этом случае для выделения памяти для массива.

В идеале я хочу использовать вызов функции Marshal.GetNativeVariantForObject (o, params_list_n[i]); Для каждого элемента массива.

ответ

6

Создание неуправляемой памяти с помощью Marshal.AllocHGlobal просто.

IntPtr pointer = Marshal.AllocHGlobal(1024); 

Если вам нужно рассчитать количество пространства, которое вы можете использовать Marshal.SizeOf.

int size = Marshal.SizeOf(typeof(IntPtr)); 
IntPtr pointer = Marshal.AllocHGlobal(size); 

Вам также необходимо включить unsafe code в проекте для этого запуска.

  1. Щелкните правой кнопкой мыши на свой проект и выберите Properties.
  2. Открыть вкладку Build.
  3. Выбрать Allow unsafe code.
+0

Спасибо. Скажите еще, как скопировать память из неуправляемого в неуправляемый. Marshal.Copy не подходит для этой цели. Насколько я понимаю – Mixer

2

Массив будет указателем на элементы. Вы можете использовать его таким же образом:

IntPtr results = Marshal.AllocHGlobal(5 * IntPtr.Size); 
+1

* sizeof * не работает с IntPtr! – Mixer

+1

@ Миксер исправлен - извините, пошел быстро –

+1

Я забыл про 'IntPtr.Size'. Престижность. :) – eandersson