gpt4 book ai didi

c# - 当通过 PInvoke 传递托管 byte[] 数组以供 Win32 填充时,是否需要固定它?

转载 作者:IT王子 更新时间:2023-10-29 04:21:38 26 4
gpt4 key购买 nike

假设您正在调用一个将填充您的字节数组的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com