灵感来源于观看了大佬的博客,于是模仿大佬的操作自己尝试下。下面是CREDIT。
原文连接:Six Important .NET Concepts: Stack, Heap, Value Types, Reference Types, Boxing, and Unboxing - CodeProject(大佬的图片和文章都比这篇博文精彩,推荐去看下。)
关于CIL部分参考的博客:
Understanding Common Intermediate Language (CIL) - CodeProject
然后关于后续用到的把dll文件反编译成IL文件是参考下面这篇博客。
如何使用ILAsm與ILDasm修改.Net exe(dll)文件_ZenDei技術網路在線
编写cs文件
在命令行输入dotnet build,或者直接代码,即可得到dll文件与exe文件。
反编译成IL文件
- 打开Visual Studio 2022 Developer Command Prompt(这个下载了VS就会自动装上)。
- 输入“ILDSM”打开反编译的软件。
- 文件--打开--选择dll/exe文件--转储--默认选项下点确定
得到IL文件
分析IL文件
终于找到了CIL(Common Intermediate Language )的文档了。以下也是CREDIT。
https://www.ecma-international.org/wp-content/uploads/ECMA-335_5th_edition_december_2010.pdf
那么我们逐行分析IL文件中的这段代码。
第一行: IL_0000: /* 19 | */ ldc.i4.3 ( /* 19 | */这个为实际字节)
ldc.
载入常量:载入常量指令被使用来加载int32, int64, float32, or float64等常量。
然后idc.下又有各种不同的指令,然后把不同的数据压入栈中。
我们要找的idc.i4.3在这里,把3压入栈里。
第二行: IL_0001: /* 0A | */ stloc.0
把值从栈上弹(pop)至本地变量
所以该行是把数值从栈上弹至本地变量0
第三行:_0002: /* 06 | */ ldloc.0
把本地变量0载入栈中。
第四行:_0003: /* 8C | (01)00000F */ box [System.Runtime]System.Int32
Convert a boxable value to its boxed form:把可装箱类型装箱成他的装箱形式。
第五六行:
IL_0008: /* 0B | */ stloc.1
IL_0009: /* 07 | */ ldloc.1
把数值从栈上弹至本地变量1
把本地变量1载入栈中。
第七行 IL_000a: /* A5 | (01)00000F */ unbox.any [System.Runtime]System.Int32
拆箱操作,把值类型形式的object拆箱成值类型
第八行: IL_000f: /* 0C | */ stloc.2
把数值从栈上弹至本地变量2
第九行 : IL_0010: /* 2A | */ ret
从方法中返回,是否需要带返回值是可选项。