【发布时间】:2016-03-09 21:46:15
【问题描述】:
我发现许多方法可以从byte[] 获取IntPtr,所有这些方法我都可以成功地传递到外部非托管代码中,但只有如果我在堆栈上分配了byte[]。尝试对byte[] 实例变量执行相同操作,我得到null (IntPtr.Zero) 结果,无论我选择哪种获取IntPtr 的方法。在这种情况下,我没有找到任何关于实例变量的处理方式是否与堆栈上分配的变量不同的信息。
这是我想用来将有效的IntPtr 获取到byte[] 实例变量的方法:
GCHandle pinned = GCHandle.Alloc(outBytes, GCHandleType.Pinned);
IntPtr ptr = pinned.AddrOfPinnedObject();
// Always true, for reasons I'm unaware.
if (ptr == IntPtr.Zero) {}
pinned.Free();
谢谢!
【问题讨论】:
-
“在堆栈上”是指
stackalloc? -
我的意思是在本地范围内声明一个字节[],如下所示:
byte[] outBytes = new byte[GetNumBytes()]。考虑到我使用的是new,我的术语可能不正确。 -
你能举一个不起作用的代码示例吗?它是一个全局数组吗?对象的成员?传递给函数的引用?
-
如果
outBytes是对象(实例变量)的成员,则IntPtr ptr为零。我会稍微充实一下我的问题中的代码。 -
不相关,但考虑使用 try-finally 子句以确保
pinned.Free()始终运行,即使您的封送代码抛出异常。否则你可能会泄露内存。