При передаче массива управляемого байта [] через PInvoke, который должен быть заполнен Win32, нужно ли его закреплять?

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

Ответ 1

Короткий ответ: Нет, пиннинг в этом случае не нужен

Дольше ответ:

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

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

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

Ответ 2

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

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

Ответ 3

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