63.CSharp函数加载时机
63.1 题目
C#中的函数是何时被加载到内存中的呢?
63.2 深入解析

在C#中,函数的加载过程涉及以下几个步骤:
按需加载:
CLR(公共语言运行时)会按需加载程序集以及其中的类型和成员。当程序执行到需要调用某个类的函数时,CLR 会负责将该函数的 IL(中间语言)代码编译成本机代码。编译和加载:
当函数首次被调用时,CLR 会将其 IL 代码编译成本机代码,并将其加载到内存中的 Text Segment 中。持久性:
一旦函数的代码被加载到内存中,它通常会一直存在于内存中,直到程序退出。
运行可执行文件后的流程
加载程序集:
程序启动时,CLR 会首先加载主程序集(即包含Main方法的程序集),然后根据需要加载其他引用的程序集。加载类型:
当程序执行到需要使用某个类型(类、接口、结构等)时,CLR 会加载该类型的元数据。加载成员:
在类型被加载后,当程序执行到需要调用某个成员(方法、属性等)时,CLR 会将该成员的 IL 代码编译成本机代码并加载到内存中。执行代码:
函数的本机代码被加载到内存后,程序便可以执行该代码。CLR 负责管理这些代码的执行,并在需要时进行垃圾回收等操作。
通过以上流程,C# 实现了按需加载和高效执行,使得程序在运行过程中能够动态地管理内存和代码的加载。
63.3 答题示例
“在 C#/.NET 中,方法(函数)的代码并非在程序启动时一次性全部加载,而是由 CLR 按需 JIT 编译并加载到内存:
- 程序集加载:程序启动后,CLR 先将入口程序集载入内存,之后才根据执行流程动态加载其它引用的程序集;
- 类型元数据:当首次访问某个类型(类/结构/接口)时,CLR 载入该类型的元数据,但并不立即编译其所有方法;
- IL→本机代码:首次调用某方法时,JIT 编译器将该方法的 IL 转为本机机器码,并将其写入代码段(文本段);
- 持久驻留:编译一次后,本机码留在内存直至 AppDomain 卸载或进程结束,后续调用直接执行,避免重复编译开销。”
63.4 关键词联想
- 按需加载(Lazy JIT)
- 程序集加载(Assembly Load)
- 类型元数据(Type Metadata)
- JIT 编译(Just‑In‑Time)
- IL → 本机代码(Native Code)
- 代码段/Text Segment
- AppDomain 卸载
- 执行时动态管理
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com