我找到许多从IntPtr
获取byte[]
的方式,所有这些方法都可以成功传递到外部非托管代码,但仅< / em>如果我在堆栈上分配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();
谢谢!
答案 0 :(得分:1)
GCHandle.Alloc( thing, GCHandleType.Pinned )
导致IntPtr.Zero
句柄的唯一时间是thing
为空时。
将字节数组引用提供给GCHandle.Alloc()
时,它是null。
这是它返回零的地方:
public class ZeroTest
{
private byte[] someArray;
public Test()
{
this.someArray = null;
}
public void DoMarshal()
{
GCHandle handle = GCHandle.Alloc( this.someArray, GCHandleType.Pinned );
try
{
// Prints '0'.
Console.Out.WriteLine( handle.AddrOfPinnedObject().ToString() );
}
finally
{
handle.Free();
}
}
}
这是它返回非零的地方:
public class Test
{
private byte[] someArray;
public Test()
{
this.someArray = new byte[1];
}
public void DoMarshal()
{
GCHandle handle = GCHandle.Alloc( this.someArray, GCHandleType.Pinned );
try
{
// Prints a non-zero address, like '650180924952'.
Console.Out.WriteLine( handle.AddrOfPinnedObject().ToString() );
}
finally
{
handle.Free();
}
}
}