.net JIT是否将IL的二进制代码转换为二进制机器代码?

.net JIT是否将IL的二进制代码转换为二进制机器代码?,.net,clr,.net,Clr,这是关于.NET的 代码(高级:c#,vb.net-人类可理解)在VS中编译并生成dll/exe,这称为IL(这也或多或少是人类可理解的) 当我们第一次在机器上运行此dll/exe时,CLR/JIT将IL转换为机器代码(二进制格式:0和1-这是人类无法理解的)。此机器代码保存在内存中,因此下次不需要转换,除非系统重新启动 ILASM.exe可用于将dll/exe(IL代码)转换为机器代码,ILDASM.exe则相反 如果编译器生成二进制格式的exe/dll(IL),那么JIT的用途是什么?由于代

这是关于.NET的

  • 代码(高级:c#,vb.net-人类可理解)在VS中编译并生成dll/exe,这称为IL(这也或多或少是人类可理解的)

  • 当我们第一次在机器上运行此dll/exe时,CLR/JIT将IL转换为机器代码(二进制格式:0和1-这是人类无法理解的)。此机器代码保存在内存中,因此下次不需要转换,除非系统重新启动

  • ILASM.exe可用于将dll/exe(IL代码)转换为机器代码,ILDASM.exe则相反

  • 如果编译器生成二进制格式的exe/dll(IL),那么JIT的用途是什么?由于代码已经是二进制格式这是否意味着IL的二进制代码通过JIT转换为二进制机器代码?

    请纠正我上面的说法

    代码(高级:c#,vb.net-人类可理解)在VS中编译并生成dll/exe,这称为IL(这也或多或少是人类可理解的)

    您需要区分IL的二进制形式和IL的文本形式-如果打开已编译的EXE或DLL文件,您将看不到文本,因此这不是人类可读的。。。但是文本表示是一种“面向对象的汇编语言”。二进制表示法是“CLI的机器代码”-但这不是您正在运行的计算机的本机机器代码

    此机器代码保存在内存中,因此下次无需进行转换

    不,据我所知不是这样-在大多数情况下,它只会保留在过程中。因此,如果启动另一个进程,它将再次JIT代码

    ILASM.exe可用于将dll/exe(IL代码)转换为机器代码,ILDASM.exe则相反。这是否也保存在内存中?什么是文件格式

    不,那不是真的。ILASM获取源IL(文本)并将其汇编成二进制IL。。。它不会将其转换为机器代码。ILDASM的作用正好相反——它将DLL或EXE转换为可读取的文本IL

    什么时候才能使用像ILASM这样的工具


    我有时使用ILDASM查看特定编译二进制文件的IL(尽管我通常使用Reflector)。我很少使用ILASM——通常是在使用ILDASM获取文本IL之后,然后我以某种有趣的方式对其进行了调整。你可以看看我的项目中的一个例子,我调整IL来表示C#中无法表示的通用约束。

    我们在Visual Studio中编写C#.NET代码并编译它。这将生成EXE/DLL。nt EXE/DLL是IL代码吗?@variable:是的,但它是IL的二进制表示形式。我把我的答案扩大了一点。好的,你能告诉我如何生成文本表示吗?@variable:从什么生成?正如我在回答中所说,从二进制文件开始,使用ILDASM。JIT只是CLR的一部分。它根据需要将二进制IL转换为机器本机代码。据我所知,它不存储在任何地方,除了在内存中(尽管您可以使用ngen提前编译它,这确实存储了结果)。