.NET基础_何为托管代码


何为托管代码? What is “managed code”?

使用.NET时,经常会遇到一个术语"托管代码"。
初次遇到会很疑惑,托管代码是什么?由谁托管?为什么要有托管代码?
本文就来解释一下托管代码的含义,并介绍其相关信息。

简单讲,托管代码就是:其执行由 运行时(runtime) 管理的代码。

runtime,运行时
runtime在初次遇到时也令人疑惑,它一个极其抽象的词。
首先,应该把它翻译成什么?
执行时间?运行时间?运行时期?…
上网查询之后,国内一般把它翻译为 运行时。但这个翻译不是很奇怪吗,至少代入上下文后,完全不能理解。
进一步搜索可了解到,runtime其实省略了一部分内容,全称一般是runtime system或runtime library(注意,这里说的是一般,因为有时确实就是字面意思,指程序运行时期,与编译时相对)。
至于是runtime system还是runtime library,我觉得没必要深究,它们都是指程序运行时期需要的东西,可能system比library更大、更"重"一些。
所以在这里,你把 运行时 理解为一个支撑程序运行的庞大系统/环境就可以了。

.NET中,此运行时称为 公共语言运行时(Common Language Runtime,简称CLR) ,它是无关实现的(如Mono、.NET Framework 或 .NET Core/.NET 5++)。CLR负责获取托管代码,并将其编译为机器码(machine code),然后执行。最重要的是,该运行时提供了一些重要的服务,例如自动内存管理(automatic memory management)、安全边界(security boundaries)和类型安全(type safety)。

这边提到的CLR就像之前说的一样的,它比较"重",除了基础的编译执行功能,还会提供一些更高级的服务/功能。

将此方式与运行C/C++程序(也称非托管代码)的方式进行对比。
在非托管的世界里,程序员几乎负责所有事情。真正的程序本质上是指操作系统(OS)加载到内存并启动的二进制文件。从内存管理到安全考虑的一切其他事情都由程序员负责。

托管代码是由可在.NET上运行的高级语言(high-level language)编写的,例如 C#、VB、F#等(它们都是高级语言)。当你用这些语言各自对应的编译器编译相应代码时,你并不会获得机器码。你将获得 中间语言代码(Intermediate Language code,简称IL) ,接着运行时会编译并执行该代码。C++是这一规则的例外,因为它也能生成在Windows上运行的原生的、非托管的二进制文件。

中间语言 & 执行 Intermediate Language & execution

什么是 “中间语言(后面都用其简称IL)”?
它是用高级.NET语言所写代码编译的产物。
一旦你编译了其中一种语言编写的代码,你会得到一份由IL构成的二进制文件。值得注意的是,IL独立于运行时之上运行的任何特定语言;甚至它还有单独的规范,如果你感兴趣,可以阅读相关章节。

一旦你从高级代码生成了IL,你很可能想要运行它。CLR会在此接管,并启动即时编译(Just-In-Time compiling,JIT也是CLR的一部分)过程,或将代码从IL即时编译(JIT-ing)为可实际在CPU上运行的机器码。通过这种方式,CLR确切地知道你的代码正在做什么,并能进行有效管理。

也就是说,在OS和高级代码之间,多了一层CLR。
高级代码无法直接生成机器码,而会生成IL(中间码)。再由CLR编译为机器码执行。

IL有时也称为通用中间语言(Common Intermediate Language,简称CIL)或微软中间语言(Microsoft Intermediate Language,简称MSIL)。

非托管代码互操作性 Unmanaged code interoperability

CLR允许跨越托管和非托管世界之间的界限,并且有许多代码可以做到这一点,即使在.NET类库中也是如此,这称为 互操作性(interoperability),简称互操作(interop) 。这允许你包装非托管库并调用它们。

即C#代码中也可以调C/C++的类库。

但是,要注意,当代码通过运行时界限时,执行的实际管理就再次到了非托管代码手中,因此又受到了同样的限制(大概是指非托管代码的那些使用限制)。

与此类似,C#是一种允许你直接在代码中使用非托管构造(例如指针)的语言,通过利用所谓的 不安全上下文,unsafe context ,指定一段不由CLR管理执行的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值