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用来执行的。

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

  1. 命令行编译运行Java

    首先要安装JDK,然后设置环境变量Path,添加C:\Program Files (x86)\Java\jdk1.8.0_66\bin 然后建立一个名为j.java的文件,里面加入如下代码: publ ...

  2. Java在DOS命令下的运行及其API文档制作过程

    该文档主要描述java程序在DOS命令下的运行,以及一些常用的命令 常用DOS命令: d: 回车 盘符切换 dir(directory):列出当前目录下的文件以及文件夹 md (make direct ...

  3. 怎样用DOS命令创建txt文本文档

    单击运行, 打开命令提示符. 例如在D盘创建文本文档,那么就先进入D盘,在后面写 D: 于是就进入了D盘怎样用DOS命令创建txt文本文档 然后在后面写命令 copy con 文件名.txt ,然后回 ...

  4. 终端命令行编译运行C#程序HelloWorld

    终端命令行编译运行C#程序HelloWorld 今天忽然有人问我,刚学习java程序的时候,一般老师都会建议我们从配置环境变量开始从命令行编译运行程序,那么学习c#的时候基本是直接安装visual s ...

  5. 【linux基础】使用命令行编译运行c++程序

    前言 在linux系统运行程序,小鹅知道的有3种编译方式,一种是直接命令行编译,一种是使用Cmake,一种是使用脚本文件(*.sh).本文介绍的是使用命令行编译. 使用过程 注意不同系统的编译器版本可 ...

  6. (转)JAVA路径问题及命令行编译运行基础(linux下)

    原地址: http://blog.csdn.net/biaobiaoqi/article/details/6846274 java的运行机制的基本概念: 源文件 也就是我们熟知的.java文件. 类文 ...

  7. DOS命令创建以日期为文件名的任务计划TXT文件

    因为每天早上都要做计划,所以做了个批处理文件来创建任务计划TXT文件 文件内容展示如下: 2013/07/09 周二 今日任务: 1. 2. 待办任务: 1. 2. 出现问题: 解决办法: 出现问题: ...

  8. 使用dos命令创建多模块Maven项目

    好吧,咱们接着上一篇博客继续用另一种方式来创建Maven项目.不过在创建之前我们应该先熟悉一些相关dos命令. 创建web项目命令: mvn archetype:generate -DgroupId= ...

  9. Windows下使用MinGW在命令行编译运行C++程序

    之前学习C语言的时候都是用IDE类似CodeBlocks的工具写完直接编译运行的,今天突然心血来潮,自己下一个编译器,在命令行下,编译运行C++程序,了解一下编译过程. 一.安装编译器 首先你需要下载 ...

随机推荐

  1. 从exp入手分析漏洞

    分析poc和分析exp有一些不一样,因为exp是人为构造后的东西,它会执行一段自定的shellcode.结果是根本不会触发异常或者异常在离触发点十万八千里的地方.这样分析poc的技巧就用不上了(因为无 ...

  2. 怎么能让json_decode解析带斜杠的字符串

    比如前台一个js object:{  aa: "cc\dd"}$d = '{\"aa\": \"cc\\dd\"}';这时候用 json_d ...

  3. 【LOJ】#2538. 「PKUWC2018」Slay the Spire

    题解 由于强化卡都是大于1的,我们分析一下就会发现,尽可能多的用强化卡,至少用一张攻击卡,一定是每组卡牌的最优选择 所以我们把攻击卡和强化卡从大到小排序 我们设\(g[i][j]\)表示前i张卡牌里选 ...

  4. linux开启端口

    开放端口的方法: 方法一:命令行方式               1. 开放端口命令: /sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT    ...

  5. Gitlab-通过API管理项目

    Gitlab有一个非常强大的API,几乎可以通过API管理在Gitlab服务器中的所有项目. 在这里我们只是测试终端点的API, 因此我们需要一个程序来进行测试 .在这里我使用的是针对Google浏览 ...

  6. 8-5 Wine trading in Gergovia Gergovia的酒交易 uva11054

    等价转换思维题 题意: 直线上有n(2<=n<=100000)个等距的村庄  每个村庄要么买酒 要么卖酒  设第i个村庄对酒的需求量为ai  绝对值小于一千  其中ai大于0表示买酒   ...

  7. 2017-2018-1 20179202《Linux内核原理与分析》第十一周作业

    Metasploit实现木马生成.捆绑.免杀 1.预备知识 (1)Metasploit Metasploit是一款开源的安全漏洞检测工具,全称叫做The Metasploit Framework,简称 ...

  8. Spring单例 和 Scope注解

    关键字  @Scope  @Qualifier  Singleton 单例 Spring是单例模式.结合Springboot的例子. Controller @Autowired private Tes ...

  9. python爬虫+词云图,爬取网易云音乐评论

    又到了清明时节,用python爬取了网易云音乐<清明雨上>的评论,统计词频和绘制词云图,记录过程中遇到一些问题 爬取网易云音乐的评论 一开始是按照常规思路,分析网页ajax的传参情况.看到 ...

  10. tomcat如何利用waf进行防护

    近期某一实验室遇到一个问题:web环境是windows+tomcat+mysql,检测到cookie注入,此时又不想修改代码.此时两种方案进行解决: 1.利用安软(waf)类进行检测防御.这里国内主要 ...