码迷,mamicode.com
首页 > Windows程序 > 详细

c#的托管代码和非托管代码的理解

时间:2018-01-20 16:23:58      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:目标   blank   const   系统资源   get   ext   com   网络连接   clear   

 
理解托管和非托管代码的前提之下,要先了解CLR(公共语言运行库)

.Net Framework 是由彼此独立又相关的两部分组成:CLR 和 类库, CLR是它为我们提供的服务,类库是它实现的功能.
.NET的大部分特性----垃圾收集,版本控制,线程管理等,都使用了CLR提供的服务

当你为.NET Framework编译源代码的时候,得到的目标代码不是CPU能识别的机器指令,而是一种叫做"微软中间语言(MSIL,或简称为IL的代码)"的新语言.CLR提供了一个实时编译器,
用来把IL代码编译为本机机器代码.这样一来,CLR能够使代码变得可移植,因为.NET应用程序的源代码必须被编译为IL代码,这些IL代码可以运行在任何提供CLR服务的平台上.从CLR的角度来看,
所有的语言都是平等的,只要有一个能生成IL代码的编译器就行,这就确保了各种语言的互操性.
managed code-托管代码 

由公共语言运行库(CLR)环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。
这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。

Unmanaged Code - 非托管代码

在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。
 
 
 
 
 
能被自动回收的就是托管.不能被自动回收的就是非托管.系统的东西就是托管的.

.net的堆就是托管堆.没有非托管堆.引用类型的引用目标就是在堆里.

值类型的值就在栈里.

所谓的系统资源.是指:网络连接,数据库连接.文件流.这种东西.

这里的托管就是指被CLR管理,托管堆就是被CLR管理的堆。非托管资源需要手动释放,托管资源由GC帮你打理。

推荐园子里的一篇博文:对于托管资源和非托管资源的理解

 

 

我觉得你可以从using关键字入手,为什么我们有时候用

using(SqlConnection conn=new SqlConnection(constr))

{...}

using(Streamstreamwrite=new FileStream()

{...}

这种代码写数据库连接,对stream的操作。

就是因为这些资源是非托管资源无法被GC自动释放,需要手动强制释放,怎样使动释放呢?using就有这种功能,它可以跟踪非托管资源周期内的活动,一旦发现非托管资源生命结束了,就会强制调用dispose方法去释放在该作用域的非托管资源的内存。你去比较下java和.net垃圾回收机制和了解下C#值类型、引用类型、堆栈、托管堆的一些基础理论,然后把这些再联系起来想想应该能得到你想要的答案了,自己想明白的事情才能完全消化进去。

 

 

 

 

 

 
 
 

c#的托管代码和非托管代码的理解

标签:目标   blank   const   系统资源   get   ext   com   网络连接   clear   

原文地址:https://www.cnblogs.com/cjm123/p/8320780.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!