反编译dll文件,C#的装箱与拆箱,

灵感来源于观看了大佬的博客,于是模仿大佬的操作自己尝试下。下面是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文件 
  1. 打开Visual Studio 2022 Developer Command Prompt(这个下载了VS就会自动装上)。
  2. 输入“ILDSM”打开反编译的软件。
  3. 文件--打开--选择dll/exe文件--转储--默认选项下点确定

  4. 得到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

从方法中返回,是否需要带返回值是可选项。

相关推荐

  1. 装箱, 包装类缓存机制

    2024-01-12 12:32:01       29 阅读
  2. C#面:简述装箱

    2024-01-12 12:32:01       53 阅读
  3. 装箱(js问题)

    2024-01-12 12:32:01       55 阅读
  4. C#装箱是怎么回事

    2024-01-12 12:32:01       31 阅读
  5. 自动装箱了解吗?原理是什么?

    2024-01-12 12:32:01       60 阅读
  6. Unity 委托事件、装箱

    2024-01-12 12:32:01       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-12 12:32:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-12 12:32:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-12 12:32:01       82 阅读
  4. Python语言-面向对象

    2024-01-12 12:32:01       91 阅读

热门阅读

  1. MongoDB分片集群搭建

    2024-01-12 12:32:01       49 阅读
  2. Qt模型视图框架:QDataWidgetMapper 数据映射

    2024-01-12 12:32:01       56 阅读
  3. 算法训练营Day37

    2024-01-12 12:32:01       53 阅读
  4. Hive命令调优大全

    2024-01-12 12:32:01       56 阅读
  5. Hive数据库:嵌入、本地、远程全攻略(下)

    2024-01-12 12:32:01       49 阅读
  6. torch.einsum用法

    2024-01-12 12:32:01       56 阅读