Chinaunix首页 | 论坛 | 博客
  • 博客访问: 50732
  • 博文数量: 20
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 255
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-19 14:01
文章分类

全部博文(20)

文章存档

2014年(20)

我的朋友

分类: C#/.net

2014-09-20 21:49:56

有几种方法可以访问与字节数组相对应的 IntPtr。


第一种,使用不安全的代码块来访问直接指向字节数组的指针。


 代码如下 复制代码 
unsafe
{
    byte[] test = new byte[5];
    fixed (byte* p = &test[0])
    {
        *p = 0xff;
    }
}
 




第二种,可以使用 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 创建内存块并将数据封送处理到该内存块。


 


 代码如下 复制代码 
[DllImport("coredll.dll",SetLastError=true)]
public static extern IntPtr Loca()lAlloc(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);
}
 
from:
阅读(761) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~