托管代码---> CLR --> 自宿主
2020-07-17 10:47 石吴玉 阅读(231) 评论(0) 编辑 收藏 举报一、托管代码
定义:托管代码同受管制的代码,由公共语言运行库环境(而不是直接由操作系统)执行的代码,托管代码应用程序可以获得公共语言运行库服务,例如:自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。
1.托管代码和非托管代码
托管/非托管是微软.net 中的特有概念。
非托管代码:也叫本地代码
托管代码:由公共语言运行库(CLR)执行的代码,而不是由操作系统直接执行。
本地代码经过两次编译:(1)源码编译为中间代码(MSIL,MicrosoftIntermediate Language)
(2)由.net 的 CLR将中间代码编译为机器代码
程序实际上被 “ 托管 ” 在公共语言运行库中。
托管代码和非托管代码的区别:
(1)编译运行过程不同
(2)跨平台能力不同
(3)程序性能不同
eg:c/c++类语言,源码首先进过预处理,对头文件以及宏进行解析,经过编译器生成汇编代码,接着经过汇编,生成机器指令,最终将所有文件链接起来。这种方式优点在于直接生成机器码,能直接被机器有效识别,但不同机器识别的机器码不一样,所以跨平台性比较差。在.net 和 java中程序代码被编译为中间代码(IL),再由CLR 编译为机器代码。,一次编译,可以在不同设备运行。
(4)释放资源的方式不同
eg:在c/c++中资源都需要手动释放,比如,new了一个指针,用过之后需要delete掉,否则会造成内存泄漏。
在c#中,运行在.net平台上的代码,分配的资源一般会自动由平台的垃圾回收器释放,这样的资源就是托管资源。但由一些例外的资源,如System.IO.StreamReader等各种流、各种连接所分配的资源,需要显示调用Close()或Dispose()释放,这种资源就叫做非托管资源。
在c# 中编写非托管代码,用unsafe声明
unsafe { //非托管代码 }