博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
任意类型转换为IntPtr
阅读量:4556 次
发布时间:2019-06-08

本文共 1112 字,大约阅读时间需要 3 分钟。

        之前,将数组、结构体等转换为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();}

转载于:https://www.cnblogs.com/chihirosan/p/5160775.html

你可能感兴趣的文章
JavaScript-基本数据类型
查看>>
CentOS 7.3 实体机启动 U 盘制作
查看>>
mysql数据库
查看>>
dede调用文章里的图片
查看>>
windows 窗体基本控件
查看>>
unix date 命令获取某日期的前一天
查看>>
python中set、list、dict内部实现原理
查看>>
Python3 MySQL 数据库连接
查看>>
正则\1\2和\\1的理解
查看>>
Python文件操作(一)
查看>>
Sage CRM 平衡区域树结构
查看>>
Codeforces Round #228 (Div. 1) C. Fox and Card Game 博弈
查看>>
电影票项目之Worker多线程
查看>>
APUE读书笔记-第16章-网络IPC: 套接字
查看>>
babel更新之后的 一些坑
查看>>
Python基础-Alex
查看>>
FTP权限问题解析,553 Can't open that file: Permission denied
查看>>
string.Format和cookie代码
查看>>
Django 1.11.7+django_pyodbc_azure-1.11.0.0+pyodbc 连接mssql 数据库
查看>>
NaN属性,isNaN函数
查看>>