通过PInvoke传递托管byte []数组以由Win32填充时,是否需要固定?

Lee*_*aks 24 .net c# clr pinvoke visual-studio

假设您正在调用将填充字节数组的Win32函数.您创建一个大小为32的数组,为空.然后将其传递给Win32函数以填充int,稍后在托管代码中使用它.字节数组是否有可能在分配时被移动或覆盖,并且由Win32函数填充?

Jar*_*Par 34

简答:不,在这种情况下不需要钉扎

更长的答案:

当穿过PInvoke边界时,CLR将自动固定对托管对象的引用.一旦PInvoke函数退出,引用将被取消固定.因此,在具有本机函数填充的情况下,byte[]必须手动固定是必需的,因为该对象仅在函数调用期间由本机代码使用.

如果本机代码缓存托管指针,则必须手动固定数组.发生这种情况时,您必须手动固定数组,直到本机代码不再需要指针.在这种情况下,我假设指针没有被缓存,因此没有必要固定

参考 - http://msdn.microsoft.com/en-us/magazine/cc163910.aspx#S2