CLR是Common Language Runtime的缩写,是.NET程序集或可执行程序运行的一个虚拟环境。CLR用于管理托管代码,但是它本身是由非托管代码编写的,并不是一个包含了托管代码的程序集,所以不能使用IL DASM进行查看,但CLR以dll的形式位于.NET版本号文件夹内。

□ C#源代码从编译到CLR运行的全过程

→编写C#源代码,以class,struct,enum,interface,delegate...的形式

→编译器把源代码编译成.dll或.exe,其中包含了一些重要信息

PE/COFF头:
它是Portable Executable/Common Object File Format的缩写,Windows操作系统之所以能加载.dll或运行.exe就是因为.dll或.exe包含PE/COFF头。Windows本身的应用程序带有Windows PE,而用.NET开发的程序集或可执行程序带有.NET PE,如果是Windows PE,操作系统执行该应用程序,如果是.NET PE,就交给CLR运行时来执行。

CLR头:
告诉操作系统这个PE/COFF头是一个.NET程序集,随之把CLR的编译环境运行起来。

清单:
描述程序集本身的信息,比如名称、版本、文化、程序集包含的资源、组成程序集的文件等。

元数据:
描述程序集包含的内容,比如程序集包含的模块、类型、类型成员的可见性(public, private,protected等)。查看元数据的过程叫反射。

CIL代码:
也就是元数据中类型的实现,包括方法体、字段等。

资源文件:
例如图片资源等。

→当点击某个可执行程序,操作系统检查PE头,创建一个进程用于加载CLR,随之检查CLR头,如果存在,就会加载位于System32下的mscoree.dll这个组件,调用其中的CoreExeMain()函数,该函数会加载合适的CLR版本,CLR正式开始运行。

→CLR中有一个Class Loader组件负责从GAC、配置文件、程序集元数据中寻找与Main()方法相关的类型,并把这些信息全部缓存起来,并且会为某个方法插入一个存根。

→CLR找到程序的入口点,通常是Main()方法开始执行。

→CLR验证类型是否安全,校验元数据是否正确,CIL代码是否是类型安全的。

→CLR即时编译,也就是通常所说的JIT编译,将托管的CIL代码编译成机器代码。还记得在加载类型的时候为每个方法插入一个存根吗?在JIT即时编译的时候,会检测每个方法的存根,如果存根的内容为空,就执行JIT即时编译。当再次调用该方法时,会再次检查存根,如果发现存根保存了本地机器代码的地址,就无需对该方法进行JIT即时编译。

当然,CLR的职责不止这些,其它的还包括内存管理、线程管理、垃圾回收等。

□ 使用"VS2012开发人员命令提示"创建、编译、运行文件,并查看IL代码

→在C盘创建demo文件夹,在demo中创建managed-code文件夹

→点击"开始"--"所有程序"--"Microsoft Visual Studio 2012"--"Visual Studio Tools"--"VS2012开发人员命令提示"

→在dos命令窗口输入如下命令,并按回车

→关闭dos命令窗口,发现在managed-code文件夹中多两个一个hello.cs文件

→重新打开"VS2012开发人员命令提示",输入如下命令

○ csc hello.cs用来编译文件
○ dir /b用来显示文件夹中的内容
○ 直接输入hello,用来运行hello.exe可执行文件

→再输入如下命令,并按回车

→弹出IL DASM窗口,用来查看IL代码

→双击"Main:void()"这个静态方法,可以看到相关IL代码。而中间IL代码是被CLR用来执行的。

转载于:https://www.cnblogs.com/darrenji/p/3957063.html

CLR基础,CLR运行过程,使用dos命令创建、编译、运行C#文件,查看IL代码相关推荐

  1. dos命令创建(删除)文件(文件夹)的几种常见方式

    1.创建文件夹的命令 我们dos中最常规的创建文件夹的命令就是md. 例:md Eva 我们就创建了一个Eva的目录. 或者就是使用mkdir进行创建(其中md和mkdir都是make directo ...

  2. linux查找时间文件,Linux基础教程 linux下使用find命令根据系统时间查找文件用法(示例代码)...

    LinuxFind 兄弟连Linux培训总结这些时间戳包括 复制代码代码如下: mtime 文件内容上次修改时间 atime 文件被读取或访问的时间 ctime 文件状态变化时间 mtime 和 at ...

  3. java基础-常用快捷键及基本dos命令

    常用快捷键 Ctrl+C : 复制 Ctrl+V : 粘贴 Ctrl+A : 全选 Ctrl+X : 剪切 Ctrl+Z : 撤销 Ctrl+S : 保存 Alt+f4 : 关闭窗口 shift+de ...

  4. 老李推荐:第8章2节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-解析处理命令行参数...

    老李推荐:第8章2节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-解析处理命令行参数 MonkeyRunnerStarter是MonkeyRunner启动时的入 ...

  5. python运行过程中会被编译成二进制_Python代码在运行过程中,会被编译成二进制代码。_学小易找答案...

    [单选题]1. ( )是违反设备安全操作规程的错误做法. [单选题]Thank you for your letter ___________ 24th March. (1.0分) [单选题]超外差接 ...

  6. c语言用命令行编译运行程序_使用C程序执行系统命令

    c语言用命令行编译运行程序 Sometimes, we may need to execute Linux/Windows DOS commands through our C program. (N ...

  7. 命令行编译运行CSharp文件

    命令行编译运行CSharp文件 找到csc.exe所在的路径.如我本机上为"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727" 在环境变量 ...

  8. Java按包编译jar_java用命令行编译运行时带有包和使用外部jar包的情况

    命令行编译运行Java程序时,加载指定目录中的Jar包: 解决方案一: 编译:javac -Djava.ext.dirs=./lib Test.java  或 javac -Djava.ext.dir ...

  9. DOS命令导出文件夹内所有文件的名称和全路径

    DOS命令导出文件夹内所有文件的名称和全路径的方法: 1.Windows中调出CMD窗口 2.在命令行中输入:dir /s/b >>aa.txt 3.打开文本文件aa.txt,就可以看见文 ...

最新文章

  1. Springboot:监控与管理 Actuator
  2. 9.4 LSMW程序创建操作手册 第8 9 10 11步
  3. 图片旋转 rotate
  4. 用计算机弹传说之下鱼姐的bgm,传说之下战斗曲曲谱_传说之下打托丽尔的bgm
  5. 【干货】如何删除“自豪地采用WordPress“
  6. 《PRML.Translation》pdf
  7. caffe 利用Python API做分类预测,以及特征的可视化
  8. linux 移动压缩包 命令,文件的复制、移动、压缩等对SELinux属性关系详解
  9. 谈朋友圈——周围的朋友们
  10. 金格iweboffice2003,ie文档编写时无法自动提示安装问题解决
  11. 超强数据恢复软件【含注册码】
  12. 极限编程和极限编程方法采用的有效的开发实践
  13. 高通8953 Android 9.0 在user模式下使用fastboot烧录
  14. 快速处理-小程序/uniapp,showToast没有效果
  15. C语言:字母金字塔(输入一个大写字母,输出从A到这个字母的金字塔
  16. 【UE5】多用户协同编辑
  17. javaWeb核心技术第六篇之BootStrap
  18. Java实现中值问题
  19. 电影(0x05 排序)
  20. 人脸核身 微信h5_微信小程序人脸核身---快速入门到实战(附开发工具类,复制即用)...

热门文章

  1. 移动namenode、secondarynamenode和jobTracker的节点(使其成为独立节点)
  2. gsoap搭建WebService服务
  3. 如何从零开始开发一款嵌入式产品(20年的嵌入式经验分享学习)
  4. 为什么“支付宝里没钱了”和“微信里没钱了”给人两种不同的感觉
  5. 恒大全国降价,最低74折,接下来会有其他楼盘跟进降价吗?
  6. 这4种钱没有也要借,不能等
  7. 如何申请到利息低的贷款?
  8. 王朔《我的千岁寒》:可以看却无法看到
  9. 计算机原码、反码、补码详解
  10. C语言实现上三角蛇形矩阵不用数组,蛇形矩阵c语言实现