当前位置: 首页 > news >正文

.net 托管代码与非托管代码

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

关键是要了解CLR(公共语言运行时)   
      .Net   Framework   是由彼此独立又相关的两部分组成:CLR   和   类库,   CLR是它为我们提供的服务,类库是它实现的功能.   .NET的大部分特性----垃圾收集,版本控制,线程管理等,都使用了CLR提供的服务   
      当你为.NET   Framework编译源代码的时候,得到的目标代码不是CPU能识别的机器指令,而是一种叫做"微软中间语言(MSIL,或简称为IL的代码)"的新语言.CLR提供了一个实时编译器,用来把IL代码编译为本机机器代码.这样一来,CLR能够使代码变得可移植,因为.NET应用程序的源代码必须被编译为IL代码,这些IL代码可以运行在任何提供CLR服务的平台上.从CLR的角度来看,所有的语言都是平等的,只要有一个能生成IL代码的编译器就行,这就确保了各种语言的互操作性.   
      为CLR而编写以及使用CLR服务的代码叫"托管代码",而那些未使用CLR服务的代码(也就是你多年以来一直编写的代码)叫"非托管代码".   
      讨论到C++在.NET托管环境中的应用,由于C++不是为.NET平台设计的语言,所以,微软需要对C++作一些扩充,这就引入了"托管扩展"这一概念,它允许我们在C++项目中使用.NET   Framework,如果有下列开发需要,就必须使用托管扩展:   
        1.   将现有的C++代码移植到托管环境中   
        2.   在C++代码中访问.NET   Framework类   
        3.   通过.NET语言访问现有的C++代码  


托管代码是一种类似于JAVA虚拟机类似的代码,但与JAVA虚拟机不同,它的执行效率还是非常好,它被叫做IL码,或是MSIL码,即中间码的意思 
非托管代码就是本地代码的意思,就是说在执行时是直接送往CPU的,


COM/COM++组件,ActiveX控件,API函数,指针运算,自制的资源文件...这些的非托管的,其它就是托管的.


对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的只是了解.net CLR如何做这些操作。也就是说对于您的应用程序创建的大多数对象,可以依靠  .NET Framework 的垃圾回收器隐式地执行所有必要的内存管理任务。
 

对于非托管资源,您在应用程序中使用完这些非托管资源之后,必须显示的释放他们,例如System.IO.StreamReader的一个文件对象,必须显示的调用对象的Close()方法关闭它,否则会占用系统的内存和资源,而且可能会出现意想不到的错误。
 

我想说到这里,一定要清楚什么是托管资源,什么是非托管资源了?
 

最常见的一类非托管资源就是包装操作系统资源的对象,例如文件,窗口或网络连接,对于这类资源虽然垃圾回收器可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源。还好.net  Framework提供了Finalize()方法,它允许在垃圾回收器回收该类资源时,适当的清理非托管资源。如果在MSDN Library 中搜索Finalize将会发现很多类似的主题,这里列举几种常见的非托管资源:ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor,FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader
,Pen,Regex,Socket,StreamWriter,Timer,Tooltip 等等资源。可能在使用的时候很多都没有注意到!
 

关于托管资源,就不用说了撒,像简单的int,string,float,DateTime等等,.net中超过80%的资源都是托管资源。
 

非托管资源如何释放,.NET Framework 提供 Object.Finalize 方法,它允许对象在垃圾回收器回收该对象使用的内存时适当清理其非托管资源。默认情况下,Finalize 方法不执行任何操作。默认情况下,Finalize 方法不执行任何操作。如果您要让垃圾回收器在回收对象的内存之前对对象执行清理操作,您必须在类中重写 Finalize 方法。然而大家都可以发现在实际的编程中根本无法override方法Finalize(),在C#中,可以通过析构函数自动生成 Finalize 方法和对基类的 Finalize 方法的调用。

例如:
~MyClass()
{
   // Perform some cleanup operations here.
}
该代码隐式翻译为下面的代码。
protected override void Finalize()
{
   try
   {
      // Perform some cleanup operations here.
   }
   finally
   {
      base.Finalize();
   }
}


但是,在编程中,并不建议进行override方法Finalize(),因为,实现 Finalize 方法或析构函数对性能可能会有负面影响。一个简单的理由如下:用 Finalize 方法回收对象使用的内存需要至少两次垃圾回收,当垃圾回收器回收时,它只回收没有终结器(Finalize方法)的不可访问的内存,这时他不能回收具有终结器(Finalize方法)的不可以访问的内存。它改为将这些对象的项从终止队列中移除并将他们放置在标记为“准备终止”的对象列表中,该列表中的项指向托管堆中准备被调用其终止代码的对象,下次垃圾回收器进行回收时,就回收并释放了这些内存。

转载于:https://my.oschina.net/guanxinsui/blog/914188

相关文章:

  • 如何在 Arch Linux 的终端里设定 WiFi 网络
  • JAVA的编译命令
  • 老用户梦碎!微软:骁龙 820 不支持 x86 应用
  • 微软高管将出席D9大会 下周展示Windows 8系统
  • 数据库构建高性能队列用于存储订单、通知和任务
  • 说说面向对象的故事,主人是人类!(二)
  • XenServer中使用Xentop查看服务器性能
  • 一个树莓派集群 (VAX)
  • C# 通过搜狐微博api远程更换壁纸
  • Android Lollipop 系统稳定性优于苹果 iOS 8
  • 安卓机器人与苹果核心,你上当了~!
  • Google新增程式掃描功能以改善Android安全性
  • 如何把一个Array 复制到ArrayList中?
  • Google 将开源 Google Earth Enterprise
  • redis安装,配置
  • 网络传输文件的问题
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • js
  • Promise面试题,控制异步流程
  • react-native 安卓真机环境搭建
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 产品三维模型在线预览
  • 工作手记之html2canvas使用概述
  • 将 Measurements 和 Units 应用到物理学
  • 经典排序算法及其 Java 实现
  • 前嗅ForeSpider教程:创建模板
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • Java性能优化之JVM GC(垃圾回收机制)
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #includecmath
  • (175)FPGA门控时钟技术
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (LeetCode) T14. Longest Common Prefix
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (汇总)os模块以及shutil模块对文件的操作
  • *上位机的定义
  • .NET 8.0 发布到 IIS
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net core 6 redis操作类
  • .net core 依赖注入的基本用发
  • .net 程序发生了一个不可捕获的异常
  • @staticmethod和@classmethod的作用与区别
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager失败
  • [hdu1561] The more, The Better 【树形DP】
  • [Hive] INSERT OVERWRITE DIRECTORY要注意的问题
  • [hive] 窗口函数 ROW_NUMBER()
  • [IE技巧] 使IE8以单进程的模式运行
  • [leetcode top100] 0924 找到数组中消失的数,合并二叉树,比特位计数,汉明距离