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();
    }
  • 相关阅读:
    51Nod-1002-数塔取数问题
    Android Studio: Application Installation Failed解决方案
    1001 数组中和等于K的数对——51NOD
    51Nod-1005 大数加法
    aiml_入门学习
    vim使用进阶
    学习寒小阳的博客之统计机器翻译
    安装cywin
    TF-IDF学习
    Java文件读写操作
  • 原文地址:https://www.cnblogs.com/chihirosan/p/5160775.html
Copyright © 2011-2022 走看看