托管代码与非托管代码

托管代码编程

托管代码(Managed Code)实际上就是中间语言(IL)代码。缓存

代码编写完毕后进行编译,此时编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码。安全

程序集(Assembly)的文件负责封装中间语言,程序集中包含了描述所建立的方法、类以及属性的全部元数据。编程语言

托管代码在公共语言运行库(CLR)中运行。这个运行库给运行代码提供了多种服务,一般来讲,公共语言运行库能够加载和验证程序集,并以此来保证中间语言的正确性。spa

当某些方法被调用时,公共语言运行库把具体的方法编译成适合本地计算机运行的机器码,而且将编译好的机器码缓存起来,以备下次调用时使用。这个过程就是即时编译。 操作系统

注意:程序其实是被“托管”在公共语言运行库中。随着程序集的运行,公共语言运行库会持续地提供各类服务,例如内存管理、安全管理、线程管理等等。线程

如图:blog

非托管代码接口

 

非托管代码(Unmanaged Code)是指直接编译成目标计算机的机器码,这些代码只能运行在编译出这些代码的计算机上,或者是其余相同处理器或者几乎同样处理器的计算机上。内存

 

非托管代码不能享受公共语言运行库所提供的一些服务,例如内存管理、安全管理等。 

 

若是非托管代码须要进行内存管理等服务,就必须显式地调用操做系统的接口,一般非托管代码调用Windows SDK所提供的API来实现内存管理。

 

非托管程序也能够经过调用COM接口来获取操做系统服务。

 

注意:C#跟Visual Studio平台的其余编程语言不同的是,C#能够建立托管程序与非托管程序。当建立的项目选择名字以MFC,ATL或者Win32开头的项目类型,那么这个项目所产生的就是非托管程序。

 

总结:

 

非托管代码(Unmanaged Code)不禁CLR公共语言运行库执行,而是由操做系统直接执行的代码。

非托管代码必须本身提供垃圾回收,类型检查,安全支持等等服务