C#托管代码和非托管代码的区别

【前置知识】

写好的程序在运行的时候会经过以下过程(即C#编译过程):

  • 源代码(即用C#语言写好的代码)被C#编译器转换为公共中间语言(Common Intermediate Language,CIL)代码
  • CIL代码被公共语言运行库(Common Language Runtime,CLR)转换为机器码

                             

(注解:【A】说法上,公共语言运行库=公共语言运行时=虚拟执行系统,虚拟执行系统是技术上更准确的术语

              【B】实际上完成CIL到机器码转换的是CLR中的 一个组件——即时编译器

              【C】机器码是底层操作系统能够识别的指令,C/C++语言写好的代码会被自身的编译器直接转换为机器码)

【托管代码】

托管代码是在公共语言运行库中运行的代码,托管代码的执行由公共语言运行库来直接控制,而不是操作系统来直接控制。具体而言,由公共语言运行库中的代码管理器来控制和执行托管代码,而公共语言运行库的其他部分会提供托管代码执行时所需要的各种服务,如垃圾回收、类型检查、安全支持等。

【非托管代码】

非托管代码是在托管代码的概念出现后相对于托管代码而言的,其实际上是计算机操纵系统可识别的机器码。非托管代码(机器码)的执行由操作系统来控制,其在执行时也需要各种服务,如垃圾回收、类型检查、安全支持等。由于没有像公共语言运行库这样的东西会自动给你提供服务,所以你需要自己提供这些服务,也就说你要写额外的代码来实现垃圾回收等功能。

【参考文献】

【1】《C#本质论5.0》

【2】https://baike.baidu.com/item/公共语言运行库