Предположим, что Вы вызываете функцию Win32, которая заполнит Ваш массив байтов. Вы создаете массив размера 32, пустой. Тогда передайте его в функции Win32, которая будет заполнена интервал и используйте его позже в Вашем управляемом коде. Там существует шанс, что массив байтов мог бы быть перемещен или перезаписан промежуточный время, он был выделен, и это заполнено в функцией Win32?
Короткий ответ: Нет, в этом случае пиннинг не нужен
Более длинный ответ:
CLR автоматически фиксирует ссылки на управляемые объекты, когда они пересекают границу PInvoke. Как только функция PInvoke выйдет, ссылка будет расцеплена. Поэтому в таких ситуациях, как заполнение родной функцией byte[]
, нет необходимости в ручном пиннинге, поскольку объект используется родным кодом только во время вызова функции.
Ручная привязка массива становится необходимой, если родной код кэширует управляемый указатель. В этом случае вы должны вручную пиннинговать массив до тех пор, пока родной код не перестанет нуждаться в указателе. В данном случае я предполагаю, что указатель не кэшируется, поэтому нет необходимости в пиннинге
Ссылка - http://msdn.microsoft.com/en-us/magazine/cc163910.aspx#S2
Простите за ответ на мой вопрос, но я считаю, что если тип непреобразуемый, как byte [], то массив будет закреплен во время сортировки время выполнения, поэтому закрепление не требуется. В другой раз объект был бы другим. Пожалуйста, поправьте меня, если я ошибаюсь.
согласно msdn Marshaling Arrays of Types только массив, переданный по ссылке, может быть записан неуправляемым кодом. Получается, что вы должны объявить параметр массива [out] или [in,out], если хотите заполнить его на стороне неуправляемого массива.
Эта страница http://msdn.microsoft.com/en-us/library/aa719896(VS.71).aspx умудряется продолжать и продолжать, не говоря уже о том, что маршаллер пинкирует массивы во время вызова из управляемого в неуправляемый, но многое из того, что он описывает, не сработало бы, если бы маршаллер не пинкировал.