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

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

24
задан Leeks and Leaks 7 February 2010 в 21:32
поделиться

3 ответа

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

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

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

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

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

34
ответ дан 28 November 2019 в 23:47
поделиться

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

0
ответ дан 28 November 2019 в 23:47
поделиться

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

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

3
ответ дан 28 November 2019 в 23:47
поделиться