gpt4 book ai didi

.net - .NET 如何以及何时实际编译代码?

转载 作者:行者123 更新时间:2023-12-04 04:49:39 25 4
gpt4 key购买 nike

假设您使用 C#、VB 和 .NET 编写了一个应用程序
当你点击构建时,它真的编译你的代码吗?我是这么认为的,直到我开始在我的一些程序集中使用 redgates 反射器并逐字查看我的代码。我本来希望循环展开并进行其他过多的优化,而不是什么都没有。

那么编译实际发生在什么时候呢?我认为当它被构建时,代码变成了 IL(中间语言),当执行发生时,它正在加载到 CLR 中?它是否仅在 CLR 期间进行优化,而不是在构建时进行优化?

最佳答案

当你在 VS 中编译时

  • 您的源代码被编译成称为通用中间语言 (CIL) 或 MSIL(Microsoft 中间语言)的字节码。
  • 来自每个类和每个方法(以及所有其他事物:O)的元数据都包含在生成的可执行文件(无论是 dll 还是 exe)的 PE 头中。
  • 如果您正在生成可执行文件,PE Header 还包括一个传统的 Bootstrap ,该 Bootstrap 负责在您执行可执行文件时加载 CLR(公共(public)语言运行时)。

  • 当你执行:
  • Bootstrap 初始化 CLR(主要通过加载 mscorlib 程序集)并指示它执行您的程序集。
  • CLR 执行您的主条目。
  • 现在,类有一个向量表,其中保存了方法函数的地址,因此当您调用 MyMethod 时,会搜索该表,然后对该地址进行相应的调用。在开始时,所有表的所有条目都有 JIT 编译器的地址。
  • 当调用此类方法之一时,将调用 JIT 而不是实际方法并获得控制权。然后,JIT 将 CIL 代码编译为适合架构的实际汇编代码。
  • 一旦代码被编译,JIT 就会进入方法向量表,并将地址替换为已编译代码的地址,这样每个后续调用都不再调用 JIT。
  • 最后,JIT 处理编译代码的执行。
  • 如果您调用另一个尚未编译的方法,则返回 4... 以此类推...

  • 我也在这里发布答案,因为另一个问题与此无关......

    关于.net - .NET 如何以及何时实际编译代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1236182/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com