0 摘要
CLR, BCL, FCL, DLL, CIL, JIT, CLI, CTS, CLS
1 在 .NET 之前
20世纪90年代末,使用微软平台的Windows编程分化成许多分支。如:
- Visual Basic (VB)
- C或 C++
- 其他相关技术:
- Win32 API
- MFC
- COM
所有这些编程技术有一个缺点,就是它们主要针对桌面程序而不是互联网进行开发。
愿景:需要一个集成的、面向对象的开发框架,它可以把一致和优雅带回编程。
2 .NET 时代
满足上述愿景所产生的框架。
.NET框架具备以下特点:
- 多平台
- 行业标准
- 安全性
.NET框架由三部分组成:
- 执行环境CLR
- 内存管理和垃圾收集
- 代码安全验证
- 代码执行、线程管理及异常处理
- 编程工具:涵盖了编码和调试需要的一切
- Visual Studio集成开发环境(IDE)
- .NET兼容的编译器(例如:C#、Visual Basic .NET、F#、IronRuby和托管的C++)
- 调试器
- Web开发服务器端技术,比如ASP.NET或WCF
- BCL基类库
.NET框架带来的好处:
- 面向对象的开发环境
- 自动垃圾收集
- 互操作性
- 不需要COM
- 简化的部署
- 基类库
- 通用基础类
- 集合类
- 线程和同步类
- XML类
3 .NET编程语言编写的代码的编译过程
.NET语言的编译器接受源代码文件,并生成名为程序集的输出文件。
- 程序集要么是可执行的,要么是DLL。
- 程序集里的代码并不是本机代码,而是一种名称为CIL的中间语言。
程序集包含的信息中,包括下列项目:
- 程序的CIL
- 程序中使用的类型的元数据
- 对其他程序集引用的元数据
程序的CIL直到被调用运行时才会被编译成本机代码。在运行时,CLR执行下面的步骤:
- 检测程序集的安全特性
- 在内存中分配空间
- 把程序集中的可执行代码发送给即时(JIT)编译器,把其中的一部分编译成本机代码。
程序集中的可执行代码只在需要的时候由JIT编译器编译,然后它就被缓存起来以备在后来的程序中执行。使用这个方法意味着不被调用的代码不会被编译成本机代码,而且被调用到的代码只被编译一次。
一旦CIL被编译成本机代码,CLR就在它运行时管理它,执行如释放无主内存、检查数组边界、检查参数类型和管理异常之类的任务。
基于此也产生了两个概念:
- 托管代码
- 非托管代码
无论原始源文件的语言是什么,都遵循同样的编译和执行过程。
源文件编译器程序集JIT编译器本机代码
4 CLR
.NET框架的核心组件是CLR,它在操作系统的顶层,负责管理程序的执行。
CLR还提供下列服务:
- 自动垃圾收集
- 安全和认证
- 通过访问BCL得到广泛的编程能力,包括如 Web 服务和数据服务之类的功能。
5 CLI
CLI公共语言基础结构,它把.NET框架的所有组件连结成一个内聚的、一致的系统。
CLI的重要组成部分:
- 公共类型系统CTS:CTS定义了一组丰富的内置类型,以及每种类型固有的、独有的特性。
- 公共语言规范CLS:详细说明了一个.NET兼容编程语言的规则、属性和行为,其主题包括数据类型、类结构和参数传递。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!