1.c#的托管代码和非托管代码
c#有自己的内存回收机制,所以在c#中我们可以只new,不用关心怎样delete,c#使用gc来清理内存,这部分内存就是managed memory,大部分时候我们工作于c#环境中,都是在使用托管内存,然而c#毕竟运行在c++之上,有的时候,(比如可能我们需要引入一些第三方的c++或native代码的库,在Unity3d开发中很常见)我们需要直接在c#中操纵非托管的代码,这些non-managed memory我们就需要自己去处理他们的申请和释放了, c# 中提供了一些接口,完成托管和非托管之间的转换,以及对这部分内存的操作。基本上有以下几种:

2.managed mem-> un-managed mem
比如在c#中调用第三方的某个c++库,库中有个函数是void func(float * data, int length).我们需要传入给data的就应该是一个非托管的代码(why?首先传入托管的内存,c#层很可能会把它gc掉,而c++还在使用,而且托管的mem它的指针地址可能会发生改变,因此直接传给c++可能拿到的地址是错误的)

代码如下:

using System.Runtime.InteropServices;

float[] _managed_data  =... // this is the c# managed data

GCHandle unmanaged_data_handle = GCHandle.Alloc(_managed_data, GCHandleType.Pinned); //这里将标记_managed_data暂时不能被gc回收,并且固定对象的地址

func(unmanaged_data_handle.AddrOfPinnedObject(),_managed_data.Length);//这里将拿到非托管内存的固定地址,传给c++

unmanaged_data_handle.Free();//使用完毕后,将其handle free,这样c#可以正常gc这块内存

3.un-managed mem->managed mem, 在c++中返回一个un-managed mem给c#使用
有时需要在c++中分配一块处理好的内存,然后返回给c#来使用,如c++中某个接口 int func(int** data) (注意这里要使用指针的指针,因为data是得到的结果)

IntPtr unmanaged_ptr=IntPtr.Zero; //定义这个c#中用来接收c++返回数据的指针类型

int length = func(out unmanaged_ptr );//调用c++的函数,使unmanaged_ptr指向c++里分配的内存,注意这里用out ,才能与c++里面的**匹配。

byte[] managed_data = new byte[length];
 Marshal.Copy(unmanaged_ptr, managed_data, 0, length);//将非托管内存拷贝成托管内存,才能在c#里面使用
 Marshal.FreeHGlobal(unmanaged_ptr);//释放非托管的内存

4.在c#直接申请一个un-managed mem传给c++
有时需要直接在c#开辟一块非托管的内存,传给c++用,这块内存同样可以在c#中用后销毁。代码如下

IntPtr unmanaged_data_prt = Marshal. AllocHGlobal(100);// 直接分配100 byte的内存

func(unmanaged_data_prt);//传给c++使用

Marshal.FreeHGlobal(unmanaged_data_prt);使用后销毁非托管内存

此外 Marshal类里面还有很多处理非托管内存的方法。
托管内存和非托管内存在c#里面可以互相自由的转化,主要通过Marshal类和GCHandle类,编程时只要注意非托管的内存一定要负责好释放就可以了。
--------------------- 
原文:https://blog.csdn.net/leonwei/article/details/41940963

转 C# 托管内存与非托管内存之间的转换相关推荐

  1. C# 托管内存与非托管内存之间的转换

    C# 托管内存与非托管内存之间的转换 c#有自己的内存回收机制,所以在c#中我们可以只new,不用关心怎样delete,c#使用gc来清理内存,这部分内存就是managed memory,大部分时候我 ...

  2. C# 托管资源和非托管资源

    原文地址:http://blog.csdn.net/zlwzlwzlw/article/details/7918633 托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源.托 ...

  3. C# 托管资源和非托管资源(Dispose、析构函数)

    https://www.cnblogs.com/herenzhiming/articles/9691524.html 资源分类: 托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内 ...

  4. C# 托管资源与非托管资源

    C# 托管资源与非托管资源 在.net 编程环境中,系统的资源分为托管资源和非托管资源. 托管资源: Net平台中,CLR为程序员提供了一种很好的内存管理机制,使得程序员在编写代码时不要显式的去释放自 ...

  5. C#Maeshal类——托管资源和非托管资源转换

    C#--Marshal.StructureToPtr方法简介 http://blog.csdn.net/livelylittlefish/article/details/2423764         ...

  6. 托管资源和非托管资源

    在.net 编程环境中,系统的资源分为托管资源和非托管资源. 对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的只是了解.net CLR如何做这些操作.也就是说对 ...

  7. .NET中的托管资源与非托管资源

    托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源.托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收. 非托管资源指的是.NET不知道如何回 ...

  8. Java直接内存与非直接内存性能测试

    什么是直接内存与非直接内存 根据官方文档的描述: A byte buffer is either direct or non-direct. Given a direct byte buffer, t ...

  9. 关于Dll、Com组件、托管dll和非托管dll的理解

    Com组件和dll区别: 1.普通dll不能通过regsvr32.exe来注册,而Com组件能通过regsvr32.exe注册. 2.Com组件是微软的一个协议,满足com组件协议的dll文件就是co ...

最新文章

  1. Gradle错误提示:Java home supplied via ‘xxx.xxx.xxx‘ is invalid
  2. python关系运算符中表示不等于的关系运算符_Python学习之------运算符表达式(关系运算符,逻辑运算符,三元表达式,成员关系)...
  3. linux ip_conntrack 连接满导致网络丢包
  4. tmp ubuntu 自动删除吗_Linux tmp目录自动清理总结
  5. WPS菜单栏自动隐藏的解决方法
  6. easycode自定义模板转载
  7. boost::checked_delete的测试程序
  8. 深度学习(六)——CNN进化史
  9. 数字类型转换成字符串类型并逆序输出
  10. python 操作psd_python psd
  11. 草图大师SketchUp pro 2018中文版
  12. win7计算机所有软件无法运行程序,解决Win7应用程序无法启动的方法
  13. 大学物理实验长度的测量实验报告_大学物理长度测量实验报告
  14. php 正则 标点符号,js正则匹配中文标点符号
  15. 金融贷超、贷款行业防止撸贷方案分析
  16. 有点恐怖,这个工具能让你在 20 秒内,克隆你的声音,并转成英语!
  17. 2022.10.14 英语背诵
  18. 上传ipa到appstore最简洁的方法
  19. Java Mail(发邮件)
  20. 冬令营2015 酱油记

热门文章

  1. Android问题笔记 - AutoSize的Toast失效
  2. 使用ChatGPT和EZDML迅速高效生成可运行的软件系统原型
  3. Number - 十进制和二进制互相转换
  4. 光纤通信系统主要由哪几部分组成
  5. JS的传递数据不刷新页面的应用
  6. nxp电源管理芯片:电源管理芯片和国产芯片的龙头股有哪些
  7. 基于STM32的安卓蓝牙多功能遥控车
  8. 和一可爱的漂亮的聪明的善良的MM聊天,聊赚钱的动机学说
  9. 艺工交叉——达芬奇,一个将艺术与工业结合的旷世奇才
  10. 西门子step7安装注册表删除_如何完全卸载Siemens PLC编程软件