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();
    }
  • 相关阅读:
    对 getaddrinfo Android 返回错误 EAI_BADFLAGS
    getaddrinfo详解
    使用moment.js管理时间
    ejs循环实例
    Express优化-合并路由
    Express重定向
    Express中间件
    express.Router创建模块化路由
    Express路由
    nodejs + express访问静态资源
  • 原文地址:https://www.cnblogs.com/chihirosan/p/5160775.html
Copyright © 2011-2022 走看看