Marshal.Copy,将 IntPtr 数组复制到 IntPtr 中



我不知道Copy(IntPtr[], Int32, IntPtr, Int32)方法是如何工作的。我虽然它可以将多个 IntPtrs 中包含的数据复制到单个 IntPtr 中(如 MSDN 所述),但显然它没有像我预期的那样工作:

IntPtr[] ptrArray = new IntPtr[]
{
    Marshal.AllocHGlobal(1),
    Marshal.AllocHGlobal(2)
 };
 Marshal.WriteByte(ptrArray[0], 0, 0xC1);
 // Allocate the total size.
 IntPtr ptr = Marshal.AllocHGlobal(3);
 Marshal.Copy(ptrArray, 0, ptr, ptrArray.Length);
 // I expect to read 0xC1 but Value is always random!!
 byte value = Marshal.ReadByte(ptr, 0);

有人知道我是否将此方法用于不是其目的的事情吗?

    static void Main(string[] args)
    {
        IntPtr[] ptrArray = new IntPtr[]
        {
            Marshal.AllocHGlobal(1),
            Marshal.AllocHGlobal(2)
        };
        Marshal.WriteByte(ptrArray[0], 0, 100);
        int size = Marshal.SizeOf(typeof(IntPtr)) * ptrArray.Length;
        IntPtr ptr = Marshal.AllocHGlobal(size);
        Marshal.Copy(ptrArray, 0, ptr, ptrArray.Length);
        // Now we have native pointer ptr, which points to two pointers,
        // each of thme points to its own memory (size 1 and 2).
        // Let's read first IntPtr from ptr:
        IntPtr p = Marshal.ReadIntPtr(ptr);
        // Now let's read byte from p:
        byte b = Marshal.ReadByte(p);
        Console.WriteLine((int)b);    // prints 100
        // To do: release all IntPtr
    }

阅读评论中的解释。

最新更新