似乎无法从 byte[] 实例变量中获取非零 IntPtr

Can't seem to get a non-zero IntPtr from a byte[] instance variable

我找到了 很多 种从 byte[] 获取 IntPtr 的方法,所有这些我都可以成功地传递到外部非托管代码中,但是只有 如果我在堆栈上分配byte[]。尝试对 byte[] 实例变量执行相同的操作,无论我选择哪种获取 IntPtr 的方法,我都会得到 null (IntPtr.Zero) 结果。在这种情况下,我还没有找到任何关于实例变量的处理方式是否与分配在堆栈上的变量不同的信息。

这是我想用来获取 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();

谢谢!

唯一一次 GCHandle.Alloc( thing, GCHandleType.Pinned ) 导致 IntPtr.Zero 的句柄是当 thing 为空时。

当您将字节数组引用提供给 GCHandle.Alloc() 时,您的字节数组引用为空。

这是 returns 零的位置:

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

这是 returns 非零的地方:

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