我们在使用c#托管代码时,内存地址和GC回收不是我们关心的,CLR已经给我们进行了暗箱操作。但是有时候我们想使用类似C语言那种方式直接对内存进行操作,或者涉及到非托管代码的调用,此时就需要保护内存地址,防止GC垃圾回收机制将内存收回。因为一旦内存被CLR回收掉,直接造成非托管代码再次访问这块内存时失效,导致程序崩溃。
C#中直接操作内存主要有以下三种方法:
1、GCHandle。
... ...
GCHandle.Alloc(Mangement_Mem,GCHandleType.Normal);
GCHandle.Alloc函数的第二个形参,除了有GCHandleType.Normal 外,还有Pinned。但Normal不会固定其地址,只是保证内存不被GC回收。而Pinned可以将地址固定住,Pinned后这将防止垃圾回收器移动内存地址。
2、 Marshal
C#中提供了一个方法集,这些方法用于分配非托管内存、复制非托管内存块、将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项方法。也只有c++.net才有托管,非托管的概念,纯的C++没有这个概念。java可以认为所有东西都是托管的。这就是通过marshal类实现。
Marshal可以实现结构体和字节序之间的转化。具体可以搜索一下网上的资料。
3、通过fixe固定地址。
将我们申请的资源通过关键字进行固定,达到使CLR不使用垃圾回收机制操作我们保护的内存。
4. 关键字unsafe。
分享到:
相关推荐
C#操作共享内存读写工程、C#操作共享内存读写工程、C#操作共享内存读写工程
在C#中,直接操作指针是相对较少见的,因为C#旨在提供一种更安全和更易于管理内存的方式。然而,有些情况下,你可能需要使用指针来与非托管代码进行交互,或者在性能要求较高的场景下进行优化。以下是关于C#中指针、...
c# Excel 操作类,可实现EXCEL的大部分操作,并且可以把数据库查询出的结果datatable直接导到EXCEL里面,注释详细! /// /// 将内存中数据表格插入到Excel指定工作表的指定位置 /// /// 数据表 /// 工作表...
这是一个使用C#开发的Sqlite数据库创建、操作的源码工程,关于Sqlite的所有操作已经单独创建了专门的跨平台【.NETCore3.1】类库包含相应的帮助类,可以直接生成后拿到任何项目中直接使用,高效简单,省去了从头开发...
c#直接提供了共享内存的相关库,但直接使用起来还是不太方便,需要使用Marshal处理内存对齐以及托管非托管转换的问题,本文提供一种,将上述操作包装,借助反射的手段,实现通过类和属性的方式使用共享内存。
C#程序设计-3期(KC008) KC008110100016-C#里是否可以直接对内存操作.docx 学习资料 复习资料 教学资源
为了确保 C# 程序和库能够以兼容的方式逐步演进, C# 的设计中充分强调了版本控制 (versioning)。许 多编程语言不太重视这一点,导致采用那些语言编写的程序常常因为其所依赖的库的更新而无法正常工 作。 C# 的设计...
如果你耐心仔细看完本文,相信以后再遇到导出EXCLE操作的时候你会很顺手觉得SO EASY,主要给新手朋友们看的,老鸟可以直接飘过了,花了一晚上的时间写的很辛苦,如果觉得对你有帮助烦请留言支持...以上4中方法都可以
本文实例讲述了C#中volatile与lock用法,分享给大家供大家参考。...volatile就是为了解决这个问题,volatile修饰的变量,不允许线程进行本地缓存,每个线程的读写都是直接操作在共享内存上,这就保证了变量始终具有一
C#通过WinIO读取BIOS的版本号 可用于工控行业的测试 程序包里有自己封装好的函数库,里面有对WinIO的操作,使用起来比较简单 这支程序可直接使用,用于工厂测试产品烧录的BIOS版本号 提供了完整的源码,使用时加个...
昨天看了关于内存的一点文章,大概这个命令就是寻找exe文件里面这些方法的地址然后把它做成dll文件吧。 这一方面将来再研究。本文主要是对excel.dll中的一些方法罗列出来,便于我自己和大家使用。
在Unity3d开发中很常见)我们需要直接在c#中操纵非托管的代码,这些non-managed memory我们就需要自己去处理他们的申请和释放了, c# 中提供了一些接口,完成托管和非托管之间的转换,以及对这部分内存的操作。...
C++中的指针不通过MSIL而是直接和内存打交道[1],这便是指针不安全的原因所在,当然也是采用指针能够提高程序运行速度的缘故;C#中的委托不与内存打交道,而是把这一工作交给CLR去完成。 CLR无法阻止将不安全的代码调用...