平时工作的时候总是使用ctrl c+ctrl v去快速开发实现业务功能,但是在工作之余,我们也应该要注意静下心来去学习和提高自己。进阶的文章随性来写,不定时更新。希望可以和大家共同学习,共同进步。今天我们一起来理解一下c#的运行机制。

  c#语言具有简单易入门的特点,初学者通常简单拖动几个控件,写几行代码就可以实现一个“程序”了,但是这样也让我们养成了一种依赖c#封装特性的习惯。

  c#是一种高级语言,通过它编写的代码不能被机器识别。在这个被机器识别的过程中:首先是windows加载MSCorEE.dll(一个.NET framework自带的链接库,可在你安装目录找到),主线程会通过调用MSCorEE.dll中的方法来初始化CLR来获取IL(即中间语言),但是,这时候的中间语言仍然不能被识别,还需要 JITCompiler 来将IL编译成可以被机器识别的cpu指令,至此,我们在项目中生成的dll或者exe文件才算是被识别。

  接下来,我们来详细探讨怎么查看这个IL(中间语言)。

 一:在vs2015中增加ILDASM反编译工具

  正所谓,工欲善其事,必先利其器。我们要想学习并且进阶,就要学会运用各类工具。首先,我们将ILDASM加载到宇宙第一开发IDE -- VS中,博主此时使用的是vs2015,因此就以vs2015来作为例子。

  在vs2015中打开工具-->外部工具,点开后选择添加,如图:(一般来说,ILDASM默认地址是:C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools)

  二:反编译后的IL详细解释

在安装了ILDASM后,打开工具就可以看到已经多了一个工具ILDASM

我们在程序中使用这个工具。如下:

首先送上一张图片帮助大家理解

1)双击打开MANIFEST,这是程序的清单文件。红色箭头表示引用的外部文件是mscorlib

.publickeytoken = (标记 ) 指定所引用程序集的实际公钥标记。公钥能唯一确定程序集。

.ver:指定引用程序集的版本

.assembly 表示程序集

 2)打开program的扩展

.class表示的Program是一个类,extends 代表Program类继承于程序集mscorlib中的System.Object类,这就告诉我们,在C#中所有的类的父类都是Object。

private为访问权限,表明该类是私有的。

auto:表明程序加载的时候内存布局是有CLR决定的,而不是由程序本身控制的。

ansi:表明类的编码为ansi编码

beforefieldinit :表明CLR可以在第一次访问静态字段之前的任何时刻执行类型构造函数。类型构造函数也就是构造函数,而使用beforefieldinit属性可以提高性能。

 3)

.ctor 表示构造函数

cil managed 表明方法体中的代码是IL代码,且是托管代码,即运行在CLR运行库中的代码

.maxstack 表明执行构造函数时,评估堆栈可容纳数据项的最大个数。评估堆栈是保存方法中所需变量的值的一个内存区域,该区域在方法执行结束时会被清空,或者存储一个返回值

IL_0000是代码行的开头。一般在IL_标记之前的部分为变量的声明和初始化操作。

ldarg.0表明加载第一个成员参数,其中ldarg是load argument 的缩

call 指令一般用于调用静态方法,而这段代码中call指令并不是在调用静态函数,而是调用System.Object构造函数。另外一个指令则一般用来调用实例方法,它的调用过程是:首先检查被调用的函数是否为虚函数,

如果不是就直接调用,如果是则检查子类是否重写,如果有重写就调用子类中的实现,如果没有重写就继续调用原来函数。

ret 指令表示执行完毕,就是return的缩写

4)看了这么久,终于到达了IL中间语言的Main方法

hidebysig :指令表示如果当前类作为父类,用该指令标记的方法将不会被子类继承

.entrypoint :指令代表该函数是程序的入口函数,每个托管应用程序都有且只有一个入口函数,CLR加载的时候,首先从.entrypoint函数开始执行。

.locals init ([0] int32 i1,[1] int32 i2)

表示定义int类型的变量,变量名称是:i1,i2

IL_0000: nop示不做任何操作 No Operation

IL_0001:ldc.i4.1:此指令的意思是:在 Evaluation Stack 置入一個个4 byte 的常数:  

stloc.0  :从计算堆栈的顶部弹出当前值并将其存储到索引 0 处的局部变量列表中,在此示例中:stloc.0。此指令的意思是:从 Evaluation Stack 取出一個值,放到第 0 号变数(V0)中

ldloc.0 :将索引 0 处的局部变量加载到计算堆栈上。也就是:把变量helloString 加载到计算堆栈上(以ld为前缀的指令表示:入栈操作  st为前缀的指令则代表着出栈操作)

ldloc.1:同上,将索引 1处的局部变量加载到计算堆栈上。

add:增加两个变量的值

ret:返回结果。

转载于:https://www.cnblogs.com/wanchenggui/p/10339231.html

c#进阶一:使用ILDASM来查看c#中间语言相关推荐

  1. ildasm.exe 查看c# dll 信息,符号 、函数等等

    ildasm.exe 查看c# dll 信息,符号 .函数等等 运行 ildasm.exe 把 C# 的 dll 拖入程序中即可

  2. Android进阶之路 - 使用Stetho查看真机数据库

    起因:维护老项目,需查看本地数据库数据,起初使用了DDMS调试,但使用时发现真机需Root.而我又不想使用模拟器,在此基础下我发现了Stetho三方框架能实现我的需求,故在使用真实有效的基础下总结此篇 ...

  3. 【进阶2-3期】JavaScript深入之闭包面试题解

    (关注福利,关注本公众号回复[资料]领取优质前端视频,包括Vue.React.Node源码和实战.面试指导) 本周正式开始前端进阶的第二期,本周的主题是作用域闭包,今天是第8天. 本计划一共28期,每 ...

  4. 【过程改进】10分钟进阶Nuget

    目录 nuget初识 nuget本地包 nuget解决依赖冲突 nuget是什么 .net版的maven(java)? 如果你用过windows的chocolatey,mac的homebrew或许更容 ...

  5. android服务进阶,我的Android进阶之旅------Android服务的生命周期回调方法

    先引用一段官网上的文字 ======================================================================================== ...

  6. Assembly学习心得

    http://blog.csdn.net/etmonitor/ Assembly学习心得 说明: 最近开始准备把学到的.NET知识重新整理一遍,眼过千遍不如手过一遍,所以我准备记下我的学习心得,已备参 ...

  7. 前端开发学习常用网站网址及介绍(都是免费的)

    在开发的时候,想记住所有的单词基本是不可能的,所以就需要进入文档,只要理清需求能做出来,就很不差了!! 扫码加博主微信 1.百度,俗称度娘,有不懂的就问百度,有问必答,跳转 2.百度翻译,不懂的单词, ...

  8. 实时大数据开发难、运维难、应用难?来,一站解决!

    2019独角兽企业重金招聘Python工程师标准>>> 最新发布 DataWorks Stream Studio重磅发布 2019年5月15日15时,阿里云DataWorks Str ...

  9. Linux常用命令及Shell的简单介绍

    一.linux命令   1.查看指令的参数搭配: man 指令名称   2.基础指令 ls  列出当前目录下的所有文档的名称(文档指的是文件和文件夹) 常用参数搭配: ls -l 列出文档详细信息 l ...

  10. [CLR via C#]17. 委托

    原文:[CLR via C#]17. 委托 回调函数是一种非常有用的编程机制,它已经存在很多年了.Microsoft .NET Framework通过委托(delegate)来提供一种回调机制.不同于 ...

最新文章

  1. vSphere可用性之三准备实验环境
  2. linux 下实现ssh免密钥登录
  3. request Form request QueryString
  4. Linux20180528
  5. [VC]WindowProc和DefWindowProc函数
  6. tcpdump截wireshark可以打开的包
  7. 频繁模式挖掘apriori算法介绍及Java实现
  8. jquery audio在微信或者客户端需要点击两次才能正常播放的问题解决方案
  9. 最最简单的使用DW编程软件
  10. 做正确的事(效果)比正确的做事(效率)更重要
  11. Kafka的Topic删不掉
  12. 起底身份倒卖产业:那些被公开叫卖的人生
  13. excel中添加有效性验证或数据验证时不选择第一行列标题的解决方法
  14. VR虚拟展厅产品展示如何实现的
  15. 7个银行的软件测试项目实战,别再说简历项目不知道怎么写了
  16. 腾讯前端组件android,前端之Android入门(2):程序目录及UI简介 - 腾讯ISUX
  17. 高速PCB(五) 信号层覆铜选择困难症
  18. 常用的3D深度相机汇总
  19. XPosed修改微信余额
  20. 贾跃亭旗下FF去年第三季净亏3亿美元 暂时避免退市危机

热门文章

  1. 360,手机助手的功能,既然有如此二面性?
  2. 佳博打印机打印条码和二维码的方法
  3. 浙江省计算机1级考试Excel,浙江省计算机一级考试(2014)Excel试题
  4. mappedBy的具体使用及其含义
  5. 计算机应用数学,计算机应用数学.PDF
  6. unity编译器安装路径_1.安装Unity
  7. w10系统 怎么快捷搜索服务器,w10系统怎么远程连接服务器
  8. [ 转载 ]微信小程序font-family
  9. c语言中各种符号的意思。
  10. (已更新)短视频去水印解析客户端小程序源代码