什么是“托管代码”?

使用 .NET 时,通常会遇到术语“托管代码”。 本文介绍 托管代码 的含义,并提供有关它的其他信息。

简单地说,托管代码就是:其执行由运行时管理的代码。 在这种情况下,无论实现(例如,Mono、.NET Framework 或 .NET Core/.NET 5+),都称为 公共语言运行时 或 CLR。 CLR 负责获取托管代码,将其编译为计算机代码,然后执行它。 除此之外,运行时提供了多个重要服务,例如自动内存管理、安全边界和类型安全性。

相反,如果运行 C/C++ 程序,则运行的代码也称为“非托管代码”。 在非托管世界中,程序员几乎负责一切。 实际程序本质上是操作系统(OS)加载到内存中并启动的二进制文件。 其他一切,从内存管理到安全注意事项都是程序员的负担。

托管代码是用可在 .NET 上运行的高级语言之一编写的,例如 C#、Visual Basic、F# 等。 使用各自的编译器编译以这些语言编写的代码时,不会获取计算机代码。 你获得 中间语言 代码,然后由运行时编译和执行。 C++是此规则的一个例外,因为它还可以生成在 Windows 上运行的本机非托管二进制文件。

中级语言 & 处决

什么是“中间语言”(或简写为 IL)? 它是用高级 .NET 语言编写的代码编译的产物。 编译用其中一种语言编写的代码后,将收到一个用 IL 编写的二进制文件。 必须注意,IL 独立于在运行时顶层运行的任何特定语言;行业甚至为它单独制定了规范,如果有需要,你可以阅读该规范。

从高级代码生成 IL 后,你很有可能想要运行它。 CLR 此时将接管工作,启动实时 (JIT) 编译过程,或者将代码从 IL 实时编译成可以真正在 CPU 上运行的机器代码。 这样,CLR 就能确切地知道代码的作用,并可以有效地 管理 代码。

中间语言有时也称为公共中间语言(CIL)。

托管代码互操作性

当然,CLR 允许越过托管与非托管环境之间的边界,同时,即使在 .NET 类库中,也有很多代码可以做到这一点。 这就是 互操作性, or 互操作 的简称。 例如,使用这些机制可以包装某个非托管库以及调用该库。 但是,请务必注意,一旦执行此操作,当代码通过运行时的边界时,执行的实际管理将再次置于非托管代码手中,因此属于相同的限制。

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

更多资源