C#的字节码格式是什么?

What is the C#'s bytecode format?

我正在尝试将 IL 反汇编器集成到我的反汇编器应用程序中 (Android-Disassembler),但我找不到一些进行 CIL 反汇编的库。 因此,我正在尝试为 CIL 开发一个简单的反汇编程序。所以我在互联网上搜索(堆栈溢出、google、维基百科等)。但是我找不到CIL汇编代码是如何变成字节码的。

我在二进制编辑器中打开了一个 C# 应用程序,(预测我可以找到人类可读的 IL 源代码)但我只能在其中找到一些二进制文件。

C#字节码长什么样?

例如X86指令字节长度可变:

NOP = 0x90,
JMP = 0xEB 0xxx 0xxx 0xxx 0xxx, ...

到目前为止,我只能找到每个指令的操作码 (https://en.wikipedia.org/wiki/List_of_CIL_instructions)。但我也想知道操作数如何应用于操作码。

(比如 88 /r 对应 mov,而不仅仅是 88。)

我可以推荐这本书:

专家 .NET 2.0 IL 汇编程序 Serge Lidin

https://www.amazon.com/Expert-NET-Assembler-Serge-Lidin/dp/1590596463

此外 ILSpy 是一个非常流行的开源反编译器:

https://github.com/icsharpcode/ILSpy

查看该源代码可能会对您有所启发。

看来ILDasm(Visual Studio附带的MSIL反汇编器)也是开源的:

https://github.com/dotnet/coreclr/tree/master/src/ildasm

希望以上内容对您有所帮助。