Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MSIL与.NET中的托管代码相同吗?_C#_.net_Compilation_Il - Fatal编程技术网

C# MSIL与.NET中的托管代码相同吗?

C# MSIL与.NET中的托管代码相同吗?,c#,.net,compilation,il,C#,.net,Compilation,Il,我对MSIL和托管代码感到困惑,它们是相同的还是不同的? 我的意思是,当我们构建C代码时会发生什么 哪一个是对的 C#代码→ C#编译器→ 托管代码→ MSIL 或 C#代码→ C#编译器→ MSIL 请提供真实的参考或链接以支持您的答案。如评论中所述,MSIL已重命名为CIL C#code>C#编译器-->CIL 因为 CIL=Managed 在上下文中,还有 本机代码=非托管 请注意,托管代码是完全不同的东西,这一点非常重要 如果要扩展它,则更正的完整过程为: .NET代码--编译器-->

我对MSIL和托管代码感到困惑,它们是相同的还是不同的? 我的意思是,当我们构建C代码时会发生什么

哪一个是对的

C#代码→ C#编译器→ 托管代码→ MSIL

C#代码→ C#编译器→ MSIL


请提供真实的参考或链接以支持您的答案。

如评论中所述,MSIL已重命名为CIL

C#code>C#编译器-->CIL

因为

CIL=Managed

在上下文中,还有

本机代码=非托管

请注意,
托管代码
是完全不同的东西,这一点非常重要


如果要扩展它,则更正的完整过程为:

.NET代码--编译器-->CIL(托管)--JIT/NGEN-->本机代码(非托管)


参考资料:


  • 编写为在CLR控制下独占运行的代码称为托管代码。(). 所以

    C#代码→ C#编译器→ CIL(以前称为MSIL)


    是正确的。

    你混淆了不同的东西。是用托管语言(C#、VB.NET、F#和许多其他语言)编写的代码,它被编译成CIL(公共中间语言,以前是Microsoft中间语言或MSIL)并在CLR的托管环境中运行

    另一方面,非托管代码直接编译为本机代码(也称为程序集),它不在CLR上运行

    当你构建你的C#代码时,它被编译成CIL。这就是为什么可以使用ildasm或Reflector之类的工具来检查编译后的代码。执行CIL代码时会发生什么具体情况取决于具体情况。可能是

  • 使用JIT编译器(最常见的选项)编译成本机代码“即时”
  • 使用预编译的本机代码执行(您可以使用NGEN获得该代码)
  • 直接解释;我认为某些版本的.Net for Windows CE或类似版本可以做到这一点

  • 为Windows编写程序时,可以编写两种类型的代码之一:托管代码和本机代码。本机代码直接编译成机器可执行代码或.dll,而托管代码是以.NET运行时为目标的代码(换句话说,其编译形式称为程序集,是包含CIL指令的文件)。在运行时,JIT编译器将CIL转换为机器代码并执行。托管和本机之间的区别与语言(及其编译器)的目标有关。本机代码以机器本身为目标,因为它被编译成一组直接的机器指令。另一方面,C语言编译器将代码编译成CIL,因为C语言编译器的目标是.NET运行时。然后可以说C#是一种“托管语言”,用它编写的任何代码都是“托管代码”。例如:

    C src  -> gcc.exe -> .exe containing a machine binary ->            processor
    C# src -> csc.exe -> .exe assembly containing CIL     -> CLR/JIT -> processor
    
    我认为之所以使用“托管”一词,是因为构成代码的指令最终由.NET运行时处理,而不是由处理器直接执行。将源代码编译到CIL的额外步骤本身并不是让代码得到管理的原因:相反,处理器从未直接执行程序的事实是。CIL正是允许多个不同的托管语言以同一运行时为目标的工具


    我知道这比仅仅说“托管语言编译成CIL”要冗长得多,但那是因为我并不认为这是一个完全准确的描述,说明是什么让代码成为托管的。Java字节码类似于CIL,但实际存在的“Java处理器”可以本机执行字节码。对于.NETCIL来说,这样的处理器也是可以想象的,这意味着编译成CIL并在这样的机器上运行的代码将成为本机代码。您的代码必须通过CLR进行处理,这一事实使它得以管理。CIL恰好是代码必须转换为的格式,因为运行时可以执行它。

    我在这里不详细介绍,因为其他人已经介绍了很多,但我想澄清一些其他答案没有很好或正确解释的问题。这在很大程度上是迂腐的,对于99.99999%的情况,您可以只想到“C#和CIL/MSIL是托管代码”,但这其中有一些微妙之处

    首先,CIL/MSIL被称为“中间语言”,这意味着它是一种计算机语言,用作源代码和最终本机代码之间的中间步骤。然而,情况并非如此。我听说过一些实验项目,他们创建了一个CPU,直接执行CIL(或java等价物,称为java字节码),而不首先将其转换为本机形式(基本上,CIL是本机形式)

    托管代码是指由某种托管运行时“管理”的代码。这通常意味着代码是垃圾收集的,并且具有某种类型的安全层,可以防止缓冲区溢出和本机代码中可能出现的其他类型的问题。在.net中,这称为公共语言运行库(CLR)

    在过去,这曾被称为“虚拟机”,以及为什么java环境被称为JVM,尽管这个术语现在在很大程度上用词不当。如今,使用JIT(即时)编译器,没有真正的“虚拟机”,而是一层代码,它“包装”本机编译的代码,以确保您不会违反规则,并在代码之后进行清理。它还将一些特定于平台的内容抽象出来,以便CIL不必担心它们

    因此,托管代码是指在托管运行时中运行的代码的概念。当CIL在运行时(如.NET运行时环境)中运行时,它被视为托管代码

    C#和VB.NET通常被认为是“托管语言”,因为它们通常编译为CIL和r