При передаче массива управляемого байта [] через PInvoke для заполнения Win32, его нужно закрепить? - PullRequest
24 голосов
/ 08 февраля 2010

Предположим, вы вызываете функцию Win32, которая заполнит ваш байтовый массив. Вы создаете массив размером 32, пустой. Затем передайте его в функцию Win32 для заполнения int и используйте его позже в своем управляемом коде. Существует ли вероятность того, что байтовый массив может быть перемещен или перезаписан между моментом его выделения и заполнения функцией Win32?

Ответы [ 3 ]

35 голосов
/ 08 февраля 2010

Краткий ответ: нет, в этом случае закрепление не требуется

Более длинный ответ:

CLR автоматически закрепит ссылки на управляемые объекты при пересечении границы PInvoke. Как только функция PInvoke выйдет, ссылка будет откреплена. Таким образом, в таких ситуациях, как заполнение нативной функции, byte[] ручное закрепление не требуется, поскольку объект используется только нативным кодом во время вызова функции.

Закрепление массива вручную становится необходимым, если собственный код кэширует управляемый указатель. Когда это происходит, вы должны вручную закрепить массив, пока нативный код больше не нуждается в указателе. В этом случае я предполагаю, что указатель не кэшируется, поэтому нет необходимости закреплять

Ссылка - http://msdn.microsoft.com/en-us/magazine/cc163910.aspx#S2

3 голосов
/ 08 февраля 2010

в соответствии с msdn Маршалинг массивов типов только массив, переданный по ссылке, может быть записан неуправляемым кодом. Таким образом, получается, что вы должны объявить параметр массива [out] или [in, out], если вы хотите заполнить его неуправляемой стороной.

Эта страница http://msdn.microsoft.com/en-us/library/aa719896(VS.71).aspx удается продолжать и продолжать, даже не говоря явно, что маршаллер связывает массивы во время вызова от управляемого к неуправляемому, но большая часть того, что он описывает, не сработает, если маршаллер не сделал т штифт.

0 голосов
/ 08 февраля 2010

Извините, что отвечаю на мой собственный вопрос, но я верю, что если тип является blittable, как, например, byte [], тогда массив будет закреплен во время выполнения во время выполнения, поэтому закрепление не потребуется. Объект в другое время был бы другим. Пожалуйста, поправьте меня, если я ошибаюсь.

...