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 中的样子!
我研究了 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 中的样子!