2013-03-24 16 views
5

przydzielić pamięci w kodzie zarządzanym używam:Jak przydzielić tablicę IntPtr [] w pamięci niezarządzanej?

IntPtr [] params_list_n = new IntPtr [5]; 

Ale dla pamięci niekontrolowana używam Marshal.AllocHGlobal A ja nie rozumiem, jak w tym przypadku można przydzielić pamięci dla tablicy.

Idealnie chcę użyć wywołania funkcji Marshal.GetNativeVariantForObject (o, params_list_n[i]); Dla każdego elementu tablicy.

Odpowiedz

6

Tworzenie pamięci niezarządzanej przy użyciu Marshal.AllocHGlobal jest proste.

IntPtr pointer = Marshal.AllocHGlobal(1024); 

Jeśli potrzebujesz obliczyć ilość miejsca, możesz użyć Marshal.SizeOf.

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

Należy również włączyć unsafe code w projekcie dla tego uruchomić.

  1. Kliknij projekt prawym przyciskiem myszy i wybierz opcję Properties.
  2. Otwórz zakładkę Build.
  3. Wybierz Allow unsafe code.
+0

Dziękuję. Powiedz mi więcej, jak skopiować pamięć z niezarządzanego na niezarządzanego. Marshal.Copy nie nadaje się do tego celu. Jak rozumiem – Mixer

2

Tablica będzie wskaźnikiem do elementów. Używa się go w taki sam sposób:

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

* sizeof * nie działa z IntPtr! – Mixer

+1

Naprawiono @Mixer - przepraszam, poszedłem szybko –

+1

Zapomniałem o 'IntPtr.Size'. Sława. :) – eandersson

Powiązane problemy