将数组转换为IntPtr

  • Post author:
  • Post category:其他


//第一种,使用不安全的代码块来访问直接指向字节数组的指针。
static IntPtr ArrayToIntptr(byte[] source)
{
    if (source == null)
    {
        return IntPtr.Zero;
    }

    unsafe
    {
        fixed (byte* point = source)
        {
            IntPtr ptr = new IntPtr(point);
            return ptr;
        }
    }
} 
 
 
//第二种,可以使用 GCHandle 来获得对象。
GCHandle
using System.Runtime.InteropServices;
 
byte[] test = new byte[5];
GCHandle hObject = GCHandle.Alloc(test, GCHandleType.Pinned);
IntPtr pObject = hObject.AddrOfPinnedObject();
 
if(hObject.IsAllocated)
{
    hObject.Free();
}
 

//第三种, 通过 LocalAlloc 创建内存块并将数据封送处理到该内存块。
LocalAlloc
[DllImport("coredll.dll",SetLastError=true)]
public static extern IntPtr LocalAlloc(uint uFlags, uint uBytes);
[DllImport("coredll.dll",SetLastError=true)]
public static extern IntPtr LocalFree(IntPtr hMem);
[DllImport("coredll.dll",SetLastError=true)]
public static extern IntPtr LocalReAlloc(IntPtr hMem, uint uBytes, uint fuFlags);
 
public const uint LMEM_FIXED = 0;
public const uint LMEM_MOVEABLE = 2;
public const uint LMEM_ZEROINIT = 0x0040;
 
byte[] test = new byte[5];
IntPtr p = LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, (uint)test.Length);
 
if (p == IntPtr.Zero)
{
    throw new OutOfMemoryException();
}
else
{
    Marshal.Copy(test, 0, p, test.Length);
}