似乎无法从byte []实例变量

时间:2016-03-09 21:46:16

标签: c# pointers pinvoke

我找到许多IntPtr获取byte[]的方式,所有这些方法都可以成功传递到外部非托管代码,但仅< / em>如果我在堆栈上分配byte[]。尝试在byte[]实例变量上执行相同操作时,无论采用哪种方法获取null,我都会获得IntPtr.ZeroIntPtr)结果。在这种情况下,我没有找到任何关于实例变量是否与堆栈上分配的变量不同的信息。

以下是我想用来获取有效IntPtrbyte[]实例变量的内容:

GCHandle pinned = GCHandle.Alloc(outBytes, GCHandleType.Pinned);
IntPtr ptr = pinned.AddrOfPinnedObject();

// Always true, for reasons I'm unaware.
if (ptr == IntPtr.Zero) {}

pinned.Free();

谢谢!

1 个答案:

答案 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();
        }
    }
}