C# MSIL与.NET中的托管代码相同吗?
我对MSIL和托管代码感到困惑,它们是相同的还是不同的? 我的意思是,当我们构建C代码时会发生什么 哪一个是对的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代码--编译器-->
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代码时会发生什么具体情况取决于具体情况。可能是
为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