IL代码与IL汇编:有区别吗?

时间:2015-11-05 11:19:09

标签: c# .net

如果我运行.NET编译器,它会生成一个包含中间语言代码(IL)的文件并将其放入.exe文件(例如)。

如果我使用像ildasm这样的工具,它会再次显示IL代码。

但是,如果我直接写入文件IL代码,那么我可以使用ilasm生成.exe文件。

它包含什么? IL代码又来了吗? IL代码是否与IL汇编代码不同?

IL代码和IL汇编之间有区别吗?

2 个答案:

答案 0 :(得分:7)

是的,他们之间存在很大差异,因为:

  • (IL)也称为Microsoft中间语言或通用中间语言,可以被认为与Java语言生成的字节代码非常相似,我认为你在你的问题中称为IL代码

  • (ILAsm)具有与本机汇编语言相同的指令集。您可以在任何文本编辑器(如notepad)中为ILAsm编写代码,然后可以使用.NET框架提供的命令行编译器(ILAsm.exe)来编译它。

我认为IL Assembly可以被认为是一种完全成熟的.NET语言(可能是一种中间语言),所以当你使用ILAsm.exe编译ILAsm时,你会以几乎相同的方式生成IL(步骤更少) C#编译器使用C#Code ...

正如评论中所说,IL Assembly基本上是.NET Byte Code的人类可读版本。

答案 1 :(得分:3)

.NET程序集不包含MSIL,它包含表示IL操作码的元数据和字节。纯二进制数据,而不是文本。任何.NET反编译器,如ildasm.exe,都知道如何将字节转换回文本。这很简单。

C#编译器直接生成二进制数据,没有中间文本格式。当您使用文本编辑器编写自己的IL代码时,您需要ilasm.exe将其转换为二进制文件。这很简单。

生成二进制数据最困难的工作是元数据btw。对其进行过度微观优化以使其尽可能小,其结构非常复杂。没有编译器直接生成字节,他们将使用pre-built component来完成该工作。值得注意的是,罗斯林不得不从头开始重写这项工作。