IL (MSIL) 和 dll 内部

IL (MSIL) And Inside Of dll

我研究了 MSIL (IL) 和 CLR 以及其他诸如从源代码到 OS

的处理路径

第三步就可以看到Intermediate Language了。我想知道 .dll 文件是否完全用中级语言编写?

这是一个.dll文件内幕代码示例,这段代码叫中间语言吗?

我在互联网上搜索了 MSIL 代码示例,我看到了下面这张图片

这些是不同的,因为我对此表示怀疑。

谢谢

其实你可以自己测试一下。 创建一个新的库项目和一个函数:

public class Class1 {
    public static int Add(int a, int b) {
        return a + b;
    }
}

编译成DLL,并在ILSpy中打开DLL。导航到您的 Add() 函数,并将下拉列表从 C# 更改为 IL。您会看到类似这样的内容:

    IL_0001: ldarg.0
    IL_0002: ldarg.1
    IL_0003: add
    IL_0004: stloc.0

这些是您的 IL 的人类可读表示。在 ILSpy 中,您可以单击每条指令(例如 ldarg.0)以查看它们的作用以及它们的十六进制指令代码。维基百科有 full list of them.

所以我们在 CIL 中的 Add() 函数如下:

opcode instruction description
0x02 ldarg.0 Load argument 0 onto the stack.
0x03 ldarg.1 Load argument 1 onto the stack.
0x58 add Add two values, returning a new value.
0x0A stloc.0 Pop a value from stack into local variable 0.

注意那里的十六进制操作码。现在在十六进制编辑器中打开 DLL。如果您查看 here,您会注意到顶部的部分不是实际代码。

如果您的十六进制编辑器有搜索功能,请查找我们操作码的十六进制序列,您会在文件中间看到:

02 03 58 0a

这就是您的 IL 在 DLL 中的样子!