Когда использовать управляемую и неуправляемую память в WriteFile () и ReadFile () - PullRequest
1 голос
/ 16 января 2012

Я получил пример кода с www.lvr.com, показывающий, как использовать WriteFile () и ReadFile () для записи / чтения с устройства USB. В этом примере Ян использует неуправляемую память в качестве параметров для WriteFile () и ReadFile (). Однако, похоже, что функции работают нормально, просто передавая эквиваленты управляемой памяти.

Public managedOverlapped As System.Threading.NativeOverlapped
Public nonManagedOverlapped As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(managedOverlapped))
Marshal.StructureToPtr(managedOverlapped, nonManagedOverlapped, False)

Public managedBuffer(64) As Byte
Public nonManagedBuffer As IntPtr  = Marshal.AllocHGlobal(64)

api_status = ReadFile(readHandle, nonManagedBuffer, 64, BytesSucceed, nonManagedOverlapped)

работает так же хорошо, как:

api_status = ReadFile(readHandle, managedBuffer, 64, BytesSucceed, managedOverlapped)

Когда необходимо использовать неуправляемую память в WriteFile / ReadFile или вообще в .Net?

1 Ответ

3 голосов
/ 16 января 2012

Blittable типы (например, Byte) просто закрепляются на месте, когда передаются нативной функции. (Ссылка: http://msdn.microsoft.com/en-us/library/75dwhxf7.aspx)

Если параметр не относится к типу blittable, копия объекта будет создана в течение всего времени вызова. Это может быть дорого для больших выделений, поэтому вы можете (на ваше усмотрение) выделять неуправляемую память напрямую и передавать ее методу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...