这是关于.NET的。
代码(高级:c#,vb.net - 人类可理解)在VS中编译并生成dll / exe这称为IL(这也或多或少是人类可理解的)。
当我们第一次在机器上运行这个dll / exe时,CLR / JIT将IL转换为机器代码(二进制格式:0' s和1' s - 这不是人类可以理解的)。此机器代码保存在内存中,因此下次不需要转换,除非系统重新启动。
ILASM.exe可用于将dll / exe(IL代码)转换为机器代码,而ILDASM.exe则相反。
如果编译器生成二进制格式的exe / dll(IL),那么JIT的目的是什么?由于代码已经是二进制格式... 这是否意味着IL的二进制代码被JIT转换为二进制机器代码?
请在上述陈述中纠正我。
答案 0 :(得分:3)
代码(高级:c#,vb.net - 人类可理解)在VS中编译并生成dll / exe这称为IL(这也或多或少是人类可理解的)。
您需要区分IL的二进制形式和IL的 textual 形式 - 如果打开已编译的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后,我以一些有趣的方式调整它。您可以查看我的Unconstrained Melody项目中的一个示例,我在其中调整IL以表示无法在C#中表示的泛型约束。