从成熟的开始学起, 等到 Core 成熟之后再开始 Core 为妙.
下面来看一些基础知识.
- 什么是 .NET Framework
它就是一个平台而已, 这个平台被设计为支持多种语言. - 在 .NET Framework 中都有些什么东西?
里面包含了成千上万的为客户语言提供支持的库(诸如 C#). 这些库分布在多个不同的模块中, 比如在其中定义了基本类型(basic types), 这样的话, 使用 .NET Framework 的不同语言实际都是在使用同一套类型系统, 而这个类型系统就是 CTS (Common Type System).
除了 CTS 这个重要内容外, .NET Framework 中还包含了 CLR ( Common Language Runtime), 它负责执行所有使用 .NET 平台开发的程序. - 在 .NET 平台上的编译并非直接将代码编译为汇编代码, 而是分为两个步骤的:
- 首先将代码编译为 CIL (Common Intermediate Language) 代码, 这个中间代码和操作系统无关, 和语言无关. 它相当于是 .NET 平台上的"字节代码".
- CIL 再通过 JIT (Just-In-Time) 编译器编译为本地可执行代码, JIT 是等到需要的时候才会进行编译, 就是说编译过程可能会当程序在运行的时候才会执行. 但开发者往往不需要去关注这样的细节了. 正是由于 JIT 的存在, 才能将统一的 CIL 代码通过不同的 JIT 编译器编译为在不同平台上执行的程序.
- 编译好的 CIL 代码存放在 Assembly 中, 它实际上是一个资源包, Assembly 包含的内容有:
- CIL 代码文件.
- meta data: 这个 Assembly 中包含的所有内容的信息, 可以理解为对这个 Assembly 自己的描述.
- 可选的资源文件: 比如声音或图片.
- 在 .NET Framework 上, 允许将可重用的 Assembly 放到统一的位置, 这个位置就是 GAC (global Assembly cache). 而放置的方式也很简单, 就是把 Assembly 放到包含 GAC 的文件夹内即可.
- .NET Framework 平台程序执行的时候被 CLR 托管(managed). 意味着 CLR 可以帮助管理内存, 处理安全问题, 跨语言调试等等. 相对地, 也有非托管(unmanaged)程序, 比如某些使用 C++ 写的程序. 不过, 在 C# 中只能写托管程序.
- 垃圾回收: 垃圾回收是托管环境提供的一个重要功能. .NET 通过垃圾回收来释放内存空间, 从而实现自动内存管理. .NET 中的垃圾回收是定期检查内存然后清理, 而清理时机和清理的频率也并非固定, 可能一秒钟若干次, 也可能几秒钟一次. 这个在编程的时候应该了然于心.
总结一下上述流程: 首先高级语言编写代码(如C#代码)-->高级语言代码编译为 CIL-->CIL连同资源和自描述信息打包到 Assemble 发布-->运行的时候进行 JIT 编译为本地代码-->在托管环境下执行
最后来了解一下链接过程:
由于可能将代码分布在多个不同的源代码文件中, 在编译为 CIL 的过程中, 这些源码文件被链接后存放到同一个 CIL 文件, 这个过程就是链接.
网友评论