托管代码---> CLR --> 自宿主

一、托管代码

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

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
{
//非托管代码
}

  

   

原文地址:https://www.cnblogs.com/yxcn/p/13328531.html