63.C#函数加载时机

  1. 63.CSharp函数加载时机
    1. 63.1 题目
    2. 63.2 深入解析
      1. 运行可执行文件后的流程
    3. 63.3 答题示例
    4. 63.4 关键词联想

63.CSharp函数加载时机


63.1 题目

C#中的函数是何时被加载到内存中的呢?


63.2 深入解析

在C#中,函数的加载过程涉及以下几个步骤:

  1. 按需加载
    CLR(公共语言运行时)会按需加载程序集以及其中的类型和成员。当程序执行到需要调用某个类的函数时,CLR 会负责将该函数的 IL(中间语言)代码编译成本机代码。

  2. 编译和加载
    当函数首次被调用时,CLR 会将其 IL 代码编译成本机代码,并将其加载到内存中的 Text Segment 中。

  3. 持久性
    一旦函数的代码被加载到内存中,它通常会一直存在于内存中,直到程序退出。

运行可执行文件后的流程

  1. 加载程序集
    程序启动时,CLR 会首先加载主程序集(即包含 Main 方法的程序集),然后根据需要加载其他引用的程序集。

  2. 加载类型
    当程序执行到需要使用某个类型(类、接口、结构等)时,CLR 会加载该类型的元数据。

  3. 加载成员
    在类型被加载后,当程序执行到需要调用某个成员(方法、属性等)时,CLR 会将该成员的 IL 代码编译成本机代码并加载到内存中。

  4. 执行代码
    函数的本机代码被加载到内存后,程序便可以执行该代码。CLR 负责管理这些代码的执行,并在需要时进行垃圾回收等操作。

通过以上流程,C# 实现了按需加载和高效执行,使得程序在运行过程中能够动态地管理内存和代码的加载。


63.3 答题示例

“在 C#/.NET 中,方法(函数)的代码并非在程序启动时一次性全部加载,而是由 CLR 按需 JIT 编译并加载到内存:

  1. 程序集加载:程序启动后,CLR 先将入口程序集载入内存,之后才根据执行流程动态加载其它引用的程序集;
  2. 类型元数据:当首次访问某个类型(类/结构/接口)时,CLR 载入该类型的元数据,但并不立即编译其所有方法;
  3. IL→本机代码:首次调用某方法时,JIT 编译器将该方法的 IL 转为本机机器码,并将其写入代码段(文本段);
  4. 持久驻留:编译一次后,本机码留在内存直至 AppDomain 卸载或进程结束,后续调用直接执行,避免重复编译开销。”

63.4 关键词联想

  • 按需加载(Lazy JIT)
  • 程序集加载(Assembly Load)
  • 类型元数据(Type Metadata)
  • JIT 编译(Just‑In‑Time)
  • IL → 本机代码(Native Code)
  • 代码段/Text Segment
  • AppDomain 卸载
  • 执行时动态管理


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏