任意类型转换为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();
}
任意类型转换为IntPtr的更多相关文章
- C# 任意类型数据转JSON格式(转)
HOT SUMMER 每天都是不一样,积极的去感受生活 C# 任意类型数据转JSON格式 /// <summary> /// List转成json /// </summary> ...
- C++中将string类型转换为int, float, double类型 主要通过以下几种方式:
C++中将string类型转换为int, float, double类型 主要通过以下几种方式: # 方法一: 使用stringstream stringstream在int或float类型转换为 ...
- (转载)Java Map中的Value值如何做到可以为任意类型的值
转载地址:http://www.importnew.com/15556.html 如有侵权,请联系作者及时删除. 搬到我的博客来,有空细细品味,把玩. 本文由 ImportNew - shut ...
- ASP.Net Core 里是如何把一个普通的 Action 返回类型转换为某种 IActionResult 的
秘密在于这个类型: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker 在它的 CreateActionResult 方法里会将相关类型 ...
- RapidJSON 代码剖析(一):混合任意类型的堆栈
大家好,这个专栏会分析 RapidJSON (中文使用手册)中一些有趣的 C++ 代码,希望对读者有所裨益. C++ 语法解说 我们先来看一行代码(document.h): bool StartArr ...
- Javascript学习笔记:2种其他类型转换为数字Number类型的方式
①使用parseInt()/parseFloat()(在ECMAScript6中是Number.parseInt()/Number.parseFloat()) console.log(parseInt ...
- Android基于mAppWidget实现手绘地图(十三)–如何显示/隐藏任意类型的地图对象
这个很简单,想要显示或隐藏任意类型的地图对象,首先要对地图对象进行分类.不同类型的地图对象放置到不同的地图图层上,然后控制地图图层的显示/隐藏即可. 实例: Layer sportsLayer = m ...
- 小问题,小细节要注意(string类型转换为bool类型)
一个表中的推荐字段是bit类型的,添加的时候推荐有两个值,如<asp:RadioButtonList ID="RadioButtonList1" runat="se ...
- C++@子类类型转换为父类类型
static_cast(*this) to a base class create a temporary copy. class Window { // base class public: vir ...
随机推荐
- xcode6.0 模拟器打不开
只要设置下这个就行了 本来以为虚拟机的问题 都把虚拟机从新安装了 杯具啊
- tcp/ip协议listen函数中backlog参数的含义与php-fpm的502 Bad Gateway
To understand the backlog argument, we must realize that for a given listening socket, the kernel ma ...
- 论文第4章:iOS绘图平台的实现
面向移动设备的矢量绘图平台设计与实现 Design and Implementation of Mobile Device-oriented Vector Drawing Platform 引用本论文 ...
- IIS6.0下 Asp.Net 拦截jpg请求
之前用mvc写了一个接口,访问格式 http://ip:port/{id}-{type}.jpg来获取一个图片,在IIS7.0+运行毫无障碍,但是在IIS6.0下,直接提示文件不存在或者已删除. 经过 ...
- How ADB works
ADB (Android Debug Bridge): How it works? 2012.2.6 early draft Tetsuyuki Kobayashi What is ADB? If y ...
- 玩转PowerShell第一节——【后台任务处理】-技术&分享
概述 相信大家对后台任务处理不陌生,比如.Net的后台线程处理,Java的线程处理等等. 而当我们用PowerShell这个强大的工具时怎么样开启后台任务呢,以及怎样处理这些任务呢,本篇将会告诉你Po ...
- [IR] Index Construction
Three steps to construct Inverted Index as following: 最难的step中: Token sequence. Sort by term. Dictio ...
- asynchronous-logging-with-log4j-2--转
原文地址:https://dzone.com/articles/asynchronous-logging-with-log4j-2 Log4J 2 is a logging framework des ...
- 【Git】基本命令使用
init: 1 git init 添加远程分支: 1 git remote add <远程主机名> <远程主机地址url> 例如:git remote add origin ...
- SQL中的连接查询及其优化原则
连接查询是SQL的主要任务,只有很好的掌握了连接查询及其优化方法才算是掌握了SQL的精髓所在.最近在面试中遇到了有关连接查询的问题,感觉回答的不是很好,总结一下. 具体示例请参考:http://www ...