.Net托管代码和非托管代码,中间语言和执行,互操作性
优采云 发布时间: 2020-08-06 16:09托管代码和非托管代码
Net Framework由两个独立且相关的部分组成: CLR和类库,CLR是它为我们提供的服务,而类库是其实现的功能.
.NET垃圾采集,版本控制,线程管理等的大多数功能都使用CLR提供的服务
当您编译.NET Framework的源代码时,获得的目标代码不是CPU识别的机器指令,而是一种称为“ Microsoft中间语言(简称MSIL,或IL代码)”的新语言. 提供了实时编译器,
用于将IL代码编译为本机代码. 这样,CLR可以使代码具有可移植性,因为.NET应用程序的源代码必须编译为IL代码,该IL代码可以在提供CLR服务的任何平台上运行. 从CLR的角度来看,
所有语言都是平等的,只要有一个可以生成IL代码的编译器,就可以确保各种语言的互操作性.
M托管代码托管代码
由公共语言运行时(CLR)环境执行的代码(不直接由操作系统执行). 托管代码应用程序可以获得公共语言的运行时服务,例如自动垃圾采集,运行时类型检查和安全支持.
这些服务有助于提供与平台和语言无关的统一托管代码应用程序行为
托管代码是其执行过程由运行时管理的代码. 在这种情况下,无论使用哪种实现(Mono,.NET Framework或.NET Core),相关的运行时都称为公共语言运行时(CLR). CLR负责提取托管代码,将其编译为机器代码,然后执行它. 此外,运行时还提供了许多重要服务,例如自动内存管理,安全性边界,类型安全性等等.
托管代码是以可以在.NET上运行的高级语言(例如C#,Visual Basic,F#等)编写的. 当使用相应的编译器来编译用这些语言编写的代码时,无法获得机器代码,但会获得中间语言代码,然后将其编译并在运行时执行. C ++是该规则的例外,因为它还可以生成可以在Windows上运行的本机非托管二进制代码.
非托管代码-非托管代码
由公共语言运行时环境之外的操作系统直接执行的代码. 非托管代码必须提供自己的垃圾回收,类型检查,安全支持和其他服务;它与托管代码不同,托管代码从公共语言运行库中获取这些服务.
相反,如果您运行C / C ++程序,则运行的代码也称为“非托管代码”. 在不受管理的环境中,程序员需要亲自负责处理很多事情. 实际程序实质上是操作系统(OS)加载到内存然后启动的二进制代码. 从内存管理到安全性考虑,任何其他工作对程序员来说都是沉重的负担.
管理可以自动回收的内容. 无法自动回收的资源不受管理. 系统事物得到管理.
.net的堆是托管堆. 没有非托管堆. 引用类型的引用目标在堆中.
值类型的值在堆栈上.
所谓的系统资源. 指: 网络连接,数据库连接. 文件流. 这种事情.
这里的管理是指由CLR管理,托管堆是CLR管理的堆. 非托管资源需要手动释放,托管资源由GC处理.
中间语言和执行
从高级代码生成IL后,您很可能希望运行它. 现在,CLR将接管工作,启动即时(JIT)编译过程,或将IL中的代码实时编译为可以在CPU上实际运行的机器代码. 这样,CLR可以准确知道代码的作用,并可以有效地管理代码.
托管代码的互操作性
当然,CLR允许跨越托管环境和非托管环境之间的边界,并且同时,即使在基类库中,也有很多代码可以做到这一点. 这称为互操作性,或简称互操作. 例如,使用这些机制可以包装非托管库并调用该库. 但是,需要注意的是,如果采用这种方法,当代码越过运行时边界时,实际的执行管理将再次移交给托管代码,因此您需要遵循
转载于: