zoukankan      html  css  js  c++  java
  • 任意类型转换为IntPtr

            之前,将数组、结构体等转换为IntPtr使用的是Marshal.Copy()、Marshal.StructureToPtr(),但是有个问题自定义的结构体数组没法这样转化,一般网上给出的解决方法就是通过unsafe的代码段使用指针来转换。

            今天看到一个函数GCHandle.Alloc(),其描述如下:

    public static GCHandle Alloc(
        Object value,
        GCHandleType type
    )

    参数
    value
    类型:System.Object
    使用 GCHandle 的对象。
    type
    类型:System.Runtime.InteropServices.GCHandleType
    GCHandleType 值之一,指示要创建的 GCHandle 的类型。
    返回值
    类型:System.Runtime.InteropServices.GCHandle
    指定的类型的新 GCHandle。 当不再需要 GCHandle 时,必须通过 Free 将其释放。

    也就是说可以通过GCHandle.Alloc来获取任意obj的句柄gchandle,再通过gchandle.AddrOfPinnedObject()来获取obj的IntPtr。这样避免了unsafe代码块,更安全易懂。不过用完要记得通过gchandle.Free()来释放。

            为了简化代码,避免忘记free,我自定义了下面的类

    class MemLock:IDisposable
        {
            GCHandle IndicesHandle;
    
    
    public MemLock(object obj)
            {
                IndicesHandle = GCHandle.Alloc(obj, GCHandleType.Pinned);
            }
    
            public IntPtr Addr()
            {
                return IndicesHandle.AddrOfPinnedObject();
            }
    
            public void Dispose()
            {
                IndicesHandle.Free();
            }
        }

    通过这样的代码就可以方便使用了。

    using (MemLock ptr = new MemLock(buff))
    {
        var p = ptr.Addr();
    }
  • 相关阅读:
    Ubuntu 16.04中VirtualBox 5.1使用U盘/USB设备的方法
    VirtualBox中的虚拟机在Ubuntu 下无法启动之问题解决
    XX-net 部署网络
    Ubuntu 16.04安装Git及GUI客户端
    Ubuntu dns
    rapidjson
    ubuntu14.04 安装 搜狗输入法
    Ubuntu中解决机箱前置耳机没声音
    C++调试帮助
    ubuntu16.04安装virtualbox
  • 原文地址:https://www.cnblogs.com/chihirosan/p/5160775.html
Copyright © 2011-2022 走看看