2016-11-11 11 views
0

Как вы пишете память, выделенную маршалом.AllocHGlobal()?Как связать память, выделенную Marshal.AllocHGlobal() в C#?

Моя первая попытка была следующая:

int bytes = 10; 
IntPtr ip = Marshal.AllocHGlobal(bytes); 
GCHandle iph = GCHandle.Alloc(ip, GCHandleType.Pinned); 

Хотя я думаю, что это только прикрепляет IntPtr, а не блок памяти ссылается IntPtr.

ответ

4

Память, выделенная AllocHGlobal, уже закреплена. возвращается IntPtr - адрес закрепленного местоположения.

ОБНОВЛЕНИЕ. Чтобы быть педантичным, вы не можете «вывести» память, выделенную AllocHGlobal, чтобы вывести что-то, чтобы сообщить сборщику мусора не перемещать объект в памяти. Память, выделенная AllocHGlobal, является «неуправляемой памятью», что означает, что это память, которой не управляет сборщик мусора.

Никакой процесс, кроме сборщика мусора, не перемещает память в вашей программе, а сборщик мусора не заботится о неуправляемых ресурсах.

+0

Хорошо, спасибо за разъяснение этого. Причина, по которой я спрашиваю, заключается в том, что я пишу код, который вызывает функцию dll, которая принимает IntPtr, и создает и прикрепляет неуправляемый объект к этому IntPtr. Когда я затем вызываю другую функцию dll, которая пытается получить доступ к этому неуправляемому объекту через IntPtr, он выдает «System.AccessViolationException». Я думал, что не связать неуправляемый объект с этим связано. Хотя мне кажется, что я еще не совсем понял, что делать. Думаю, мне придется задать еще один вопрос. Спасибо, в любом случае :) – cycloidistic

 Смежные вопросы

  • Нет связанных вопросов^_^