【问题标题】:IL (MSIL) And Inside Of dllIL (MSIL) 和 dll 的内部
【发布时间】:2021-11-06 03:55:41
【问题描述】:

我研究了 MSIL (IL) 和 CLR 以及其他东西,比如从源代码到操作系统的处理路径

我们可以在第三步看到中间语言。我想知道.dll 文件是否完全用中间语言编写?

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

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

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

谢谢

【问题讨论】:

  • “是的,你的 dll(通常)包含大量的 IL,而不是机器代码”——是吗?虽然显示的片段只是一些 xml 清单数据
  • .NET DLL 包含 IL,但它被打包为 Windows PE 文件 see here。当您查看 DLL 的字节时,您会看到 PE 标头、其他一些东西,然后是实际的 IL。您发布的内容只是一个 UTF-8 编码的 XML 文件。那个特别的看起来像ClickOnce application manifest
  • 答案是肯定的。下一个问题?
  • 技术上它现在被称为CIL(通用中间语言)而不是IL。 /pedantmode
  • @TheGeneral 不,谢谢,但是我在互联网上看到了不同的 MSIL 代码示例,因为我对此表示怀疑。

标签: c# .net clr


【解决方案1】:

您实际上可以自己进行测试。 创建一个新的库项目和一个函数:

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 中的样子!

【讨论】:

    猜你喜欢
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多