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

标签 c# .net visual-studio clr pinvoke

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

相关文章:

c# - 如何以编程方式展平 SVG 文件中的变换?

c# - 将 JSON 对象和对象列表传递给 ASP.Net Controller

c# - 如何用多项式 x16 + x12 + x5 + 1 计算 CRC 16

visual-studio - 如何在 Visual Studio 中设置路径?

c# - 如何在没有 Visual Studio 的情况下使用自定义脚本添加/更新引用?

c# - 当字段名称有两个井号时 iTextSharp 抛出 XML 错误

c# - 在实体上显式加载多个引用/集合

.net - 未找到类型 'elements' 上的公共(public)成员 'DBNull'

c# - SelectList 没有选择正确的值

visual-studio - Visual Studio2005。RC文件包括