是 dll 文件是 CIL(通用中间语言)如果不是 CLR 如何执行 CIL



在Visual Studio中,当我们编译源代码时,它将生成一个字节代码,然后在我们构建它时创建一个dll文件。我已经卡住了字节码(常见的中间语言(如何由 .net 框架执行。我知道 CIL 和 DLL 是平等的,但我不确定。请澄清我老板。

简而言之,当 .Net 语言编译器编译项目时,它会变成 .Net 模块程序集。它们中的任何一个都包含 IL(中间语言(代码。仅 .Net 模块不可用,因为它必须包含在程序集中。(.net 模块不常用。最常见的是,从编译项目中获得的 dll 是一个模块程序集(。

在目标计算机上"安装"此程序集后,您有两种选择:

  • 它可以按原样安装,即 Dll 包含 IL。只有在执行期间,.Net 运行时的一个组件(称为 Jitter(才会在执行代码时将其转换为机器代码(本机程序集(。每次加载程序集以执行时,都会针对每个新进程重复将 IL 转换为本机机器代码的过程。

  • 它可以在安装过程中转换为机器代码(使用 ngen 等工具(。每次执行时,机器代码都准备好执行,因此将提供更快的方法启动/首次执行。

注意:主题总体上很广泛,这是该过程的 10,000 英尺级概述。有许多细节,并且像.Net Native这样的新兴技术被排除在外,以使这个答案保持简单,并且与问题的提出方式最相关。

简单来说,

C# ->

C# 编译器(编译时(->程序集 (DLL/EXE( 或 .net 模块(MSIL 形式(

汇编 -> JIT 编译器(运行时(-> 机器代码(二进制形式(

有关更多详细信息,http://msdn.microsoft.com/en-in/library/ht8ecch6(v=vs.90(.aspx

.

NET 框架中的公共中间语言 (CIL( 代码是编译器编译源代码后获得的.DLL和.EXE文件。

简单来说,编译过程大约有 3 个主要代码阶段:

  1. 源代码(编译器的主要输入(
  2. 汇编代码/字节码(中间结果(
  3. 机器代码/本机代码(经过实际执行的最终输出(

.DLL或.EXE文件属于第二阶段。

.DLL称为库程序集,.EXE称为进程程序集。两者都是 CIL 形式。

进程程序集表示将使用库程序集中定义的类的进程。

这意味着 CIL 和 DLL 并不完全"相等",因为 CIL 有两种形式 - .DLL(静态/库程序集(和.EXE(可执行文件/进程程序集(。

因此,实际上,.DLL文件或.EXE文件(CIL 形式(通常被移植到安装了 .NET 框架的客户端计算机(指示其中包含 JIT 编译器的 CLR 存在于其中(,从表面上看,似乎一旦您单击.EXE文件,它就会被执行, 但实际上,CLR(JIT( 会在单击此文件后将 .DLL/.EXE 转换为最终在后端执行的机器代码。

有关更多详细信息,请查看:https://en.wikipedia.org/wiki/Common_Intermediate_Languagehttps://en.wikipedia.org/wiki/Assembly_%28CLI%29

最新更新