假设您正在调用一个将填充您的字节数组的 Win32 函数。您创建一个大小为 32 的空数组。然后将其传递给 Win32 函数以填充 int,稍后在您的托管代码中使用它。在分配字节数组和由 Win32 函数填充字节数组之间,是否存在可能移动或覆盖字节数组的可能性?
最佳答案
简短回答:不,在这种情况下不需要固定
更长的答案:
当托管对象跨越 PInvoke 边界时,CLR 将自动固定对托管对象的引用。一旦 PInvoke 函数退出,引用将被取消固定。因此,在使用 native 函数填充 byte[]
等情况下,无需手动固定,因为该对象仅在函数调用期间由 native 代码使用。
如果 native 代码缓存托管指针,则必须手动固定数组。发生这种情况时,您必须手动固定数组,直到 native 代码不再需要该指针。在这种情况下,我假设指针没有被缓存,因此没有必要固定
引用 - http://msdn.microsoft.com/en-us/magazine/cc163910.aspx#S2
关于c# - 当通过 PInvoke 传递托管 byte[] 数组以供 Win32 填充时,是否需要固定它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2218444/