灵感来源于观看了大佬的博客,于是模仿大佬的操作自己尝试下。下面是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技術網路在線
在命令行输入dotnet build,或者直接代码,即可得到dll文件与exe文件。
得到IL文件
终于找到了CIL(Common Intermediate Language )的文档了。以下也是CREDIT。
https://www.ecma-international.org/wp-content/uploads/ECMA-335_5th_edition_december_2010.pdf
那么我们逐行分析IL文件中的这段代码。
?ldc.
载入常量:载入常量指令被使用来加载int32, int64, float32, or float64等常量。
然后idc.下又有各种不同的指令,然后把不同的数据压入栈中。
我们要找的idc.i4.3在这里,把3压入栈里。
把值从栈上弹(pop)至本地变量
所以该行是把数值从栈上弹至本地变量0
把本地变量0载入栈中。
Convert a boxable value to its boxed form:把可装箱类型装箱成他的装箱形式。
?
第五六行:
????IL_0008: ?/* 0B ? | ? ? ? ? ? ? ? ? ?*/ stloc.1
? ? IL_0009: ?/* 07 ? | ? ? ? ? ? ? ? ? ?*/ ldloc.1
把数值从栈上弹至本地变量1
把本地变量1载入栈中。
拆箱操作,把值类型形式的object拆箱成值类型
? ?把数值从栈上弹至本地变量2
从方法中返回,是否需要带返回值是可选项。