MVC 之前的那点事儿系列(1): 进入 CLR

在深入探讨 MVC(Model-View-Controller)架构之前,了解一些基础的技术背景是非常有必要的。其中,CLR(Common Language Runtime)作为 .NET 平台的核心组件,扮演着至关重要的角色。CLR 是 .NET 框架的基础运行时环境,它负责管理代码的执行、内存分配、垃圾回收等重要任务。本系列文章将逐步揭开 MVC 之前的这些技术奥秘,而本文将聚焦于 CLR,带您深入了解进入 CLR 的相关知识。

目录#

  1. CLR 概述
  2. CLR 的主要组成部分
  3. 托管代码与非托管代码
  4. CLR 的初始化过程
  5. 示例代码:进入 CLR 运行环境
  6. 总结
  7. 参考资料

CLR 概述#

CLR 是微软为 .NET 平台设计的一种运行时环境,它提供了与编程语言无关的执行环境。这意味着,无论你使用的是 C#、VB.NET 还是其他支持 .NET 的语言,最终的代码都将在 CLR 上运行。CLR 提供了诸如内存管理、类型安全、异常处理等服务,使得开发者可以更专注于业务逻辑的实现,而无需过多关注底层的系统细节。

CLR 的主要组成部分#

公共类型系统(Common Type System, CTS)#

CTS 定义了在 .NET 平台上使用的所有类型的规则和结构。它确保了不同编程语言之间的类型兼容性,使得开发者可以在不同语言之间进行互操作。例如,在 C# 中定义的类可以在 VB.NET 中被引用和使用。

通用语言规范(Common Language Specification, CLS)#

CLS 是 CTS 的一个子集,它定义了一组最低标准,所有支持 .NET 的编程语言都必须遵守这些标准。这确保了不同编程语言之间的互操作性,使得开发者可以创建跨语言的组件和应用程序。

垃圾回收器(Garbage Collector, GC)#

GC 是 CLR 中负责内存管理的重要组件。它会自动回收不再使用的内存,避免了手动内存管理带来的复杂性和潜在的内存泄漏问题。GC 会定期检查内存中的对象,标记并回收那些不再被引用的对象。

即时编译器(Just-In-Time Compiler, JIT)#

JIT 编译器负责将中间语言(Intermediate Language, IL)代码转换为机器码。当程序运行时,JIT 编译器会根据需要将 IL 代码逐段编译成机器码,提高程序的执行效率。

托管代码与非托管代码#

托管代码#

托管代码是指在 CLR 管理下运行的代码。使用支持 .NET 的编程语言(如 C#、VB.NET)编写的代码都是托管代码。托管代码可以利用 CLR 提供的各种服务,如垃圾回收、类型安全检查等。

非托管代码#

非托管代码是指不依赖于 CLR 运行的代码,通常是使用传统的编程语言(如 C、C++)编写的代码。非托管代码需要手动管理内存和资源,并且不具备 CLR 提供的一些高级特性。

在 .NET 应用程序中,有时需要与非托管代码进行交互,这时可以使用 P/Invoke(Platform Invoke)技术来调用非托管 DLL 中的函数。

CLR 的初始化过程#

当一个 .NET 应用程序启动时,会经历以下主要的 CLR 初始化步骤:

  1. 加载 CLR:操作系统首先会加载 CLR DLL 到内存中。
  2. 初始化 CLR:CLR 会进行一系列的初始化操作,包括设置全局数据结构、加载核心类库等。
  3. 加载应用程序集:CLR 会根据应用程序的配置文件,加载所需的程序集。
  4. 执行入口点:CLR 会找到应用程序的入口点(通常是 Main 方法)并开始执行。

示例代码:进入 CLR 运行环境#

以下是一个简单的 C# 示例,展示了如何创建一个基本的 .NET 应用程序,从而进入 CLR 运行环境:

using System;
 
namespace HelloCLR
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, CLR!");
        }
    }
}

代码解释#

  1. using System;:这行代码引用了 System 命名空间,该命名空间包含了许多常用的类和方法。
  2. namespace HelloCLR:定义了一个命名空间 HelloCLR,用于组织代码。
  3. class Program:定义了一个名为 Program 的类。
  4. static void Main(string[] args):这是应用程序的入口点,CLR 会从这里开始执行程序。
  5. Console.WriteLine("Hello, CLR!");:这行代码输出一条消息到控制台。

总结#

通过本文的介绍,我们了解了 CLR 的基本概念、主要组成部分、托管代码与非托管代码的区别,以及 CLR 的初始化过程。同时,我们还通过一个简单的示例代码展示了如何进入 CLR 运行环境。CLR 作为 .NET 平台的核心,为开发者提供了强大的功能和便利,使得开发高效、安全的应用程序变得更加容易。

参考资料#

  1. Microsoft Docs: Common Language Runtime (CLR)
  2. 《.NET 框架程序设计(第 4 版)》,Jeffrey Richter 著
  3. CLR via C# (4th Edition)