【问题标题】:Is dll file is CIL(common intermidiate language) if not how the CLR execute the CIL?如果不是 CLR 如何执行 CIL,dll 文件是 CIL(通用中间语言)吗?
【发布时间】:2014-12-11 05:18:23
【问题描述】:

在 Visual Studio 中,当我们编译源代码时,它会生成一个字节码,然后当我们构建它时,创建一个 dll 文件。我一直坚持字节码(常见的中间 c 语言)是如何由 .net 框架执行的。我理解 CIL 和 DLL 是平等的,但我不确定。请老板澄清一下。

【问题讨论】:

  • 请尝试改写/澄清问题。改进语言/语法将有助于更好地理解您的要求。
  • 你所说的“我的理解是平等的”是什么意思,在那个陈述中你指的是哪两个实体?

标签: c# .net clr cil


【解决方案1】:

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

在目标机器上“安装”此程序集后,您有两个选择:

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

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

注意:总体而言,该主题很广泛,这是对过程的 10,000 英尺级别的概述。有许多细节,以及诸如 .Net Native 等新兴技术已被省略,以使这个答案保持简单并与提出问题的方式最相关。

【讨论】:

    【解决方案2】:

    简单来说,

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

    程序集 -> JIT 编译器(运行时)-> 机器码(二进制形式)

    更多详情, http://msdn.microsoft.com/en-in/library/ht8ecch6(v=vs.90).aspx

    【讨论】:

    • 我认为在这里简单地说“装配”是非常令人困惑的,因为这个词有两个不同的含义,两者都可能在这里相关:assemblyassembly
    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多