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

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命令窗口输入如下命令,并按回车
1


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


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

 

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

 

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


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


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

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

表单的全选取消全选

<div class"wrap"><table border"1" cellspacing"0" cellpadding"0"><caption>恭喜发财</caption><thead><tr><th><input type"checkbox" id"j_cbAll" checked&quo…

VUE 数据绑定模块渲染 computed(实现通过路由id 查询数据json结构,对应的值来放在面包屑中)...

异步请求的值放在vuex中&#xff0c;然后页面挂载该数据和渲染页面 computed 计算属性是基于它的依赖缓存的。计算属性在它的相关依赖发生改变时会重新取值&#xff0c;所以当ajax请求回来的数据发生变化时&#xff0c;计算属性的值会进行更新&#xff0c;相关的模板引用也会重…

ThinkJs笔记琐碎

ThinkJs笔记琐碎 记录一些琐碎的在使用ThinkJs遇到的问题 静态资源访问 ThinkJs默认production环境关闭对www下资源的相对路径的访问&#xff0c;官方建议通过nginx转向的地址的绝对路径访问&#xff0c;想要在production环境访问相对路径的话需要到src/config/middleware.js里…

js(Dom+Bom)第二天(1)

JavaScript-DOM操作 核心知识点 className操作标签样式style属性方式操作标签样式操作表单控件 学习目标 能够通过className方式给标签设置样式能够通过style方式给标签设置样式能够获取表单控件中的值 操作元素样式 语法&#xff1a;1.dom.className 类名;2.dom.style.属…

HDU 4339 Query

算法: 比赛时没有想到好的算法&#xff0c;暴力是O&#xff08; Q * N &#xff09;肯定超时。 赛后&#xff0c;线段树&#xff0c;树状数组&#xff0c;HASH都能AC&#xff0c;想了下&#xff0c;的确用树状数组 时间复杂度就可以优化到O&#xff08;Q * lgN * lgN) 2000msAC…

201904快速阅读术

在看过了几本数之后&#xff0c;发现原来培养读书的习惯好像也不太难&#xff0c;“将读书融入生活&#xff0c;框定读书时间” 生活中&#xff0c;我确实也是这样执行了。利用每天上下班的时间听书&#xff0c;有些觉得可以读快的书籍用了1.5倍速度在听&#xff0c;难懂的部分…

js(Dom+Bom)第二天(2)

webAPI 00-操作图片 知识点-获取图片src属性 图片对象.src ----> 获取图片路径注意: 1. 获取到的图片路径是一个绝对路径知识点-动态的给图片标签设置路径 图片对象.src 图片路径;注意: 1.可以设置绝对路径(不推荐) 2.可以设置相对路径课堂案例-切换图片案例 01-操作标…

javaScript今日总结

javascript简单介绍ECMAScript 1.语法 2.变量&#xff1a;只能使用var定义&#xff0c;如果在函数的内容使用var定义&#xff0c;那么它是一个局部变量&#xff0c;如果没有使用var它是一个全局的。弱类型&#xff01; 3.数据类型&#xff1a;原始数据类型(undefined/null/stri…

使用Connector / Python连接MySQL/查询数据

使用Connector / Python连接MySQL connect()构造函数创建到MySQL服务器的连接并返回一个 MySQLConnection对象 在python中有以下几种方法可以连接到MySQL数据库&#xff1a; 1.使用connect&#xff08;&#xff09;构造函数import mysql.connectorcnx mysql.connector.connect…

最简方式 表格编辑 基于 el-table

共下面5点1.新增一个显示和隐藏的参数2.在显示那边新增一个input框&#xff0c;用v-model绑定数据&#xff0c;用v-if来显示和隐藏3.给之前的显示的span标签添加v-else 和上面形成if else4.编辑和保存按钮同理&#xff0c;然后编辑按钮触发的任务将所有输入打开。即seen置为tru…

js(Dom+Bom)第三天(1)

JavaScript-DOM 节点的层次结构 hasChildNodes() 【父元素中是否包含子节点】 dom.hasChildNodes() 总结&#xff1a;1.该方法返回的是一个布尔类型的结果用来判断当前元素中是否存在子节点。2.该方法会将元素中所有的节点都获取&#xff08;包括空格&#xff0c;回车符&#…

Spring Boot 自动配置原理

自动配置原理配置文件到底能写什么&#xff1f;怎么写&#xff1f;自动配置原理&#xff1b; 参考&#xff1a;https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#common-application-properties配置文件能配置的属性参照1、自动配置原理&#xff…

这 4 款实用小工具,能让你的电脑变得好用又骚气

在日常生活中&#xff0c;我们总会遇到一些重复又繁琐的工作&#xff0c;它们不仅容易令人烦躁&#xff0c;也极大拖累了咱们的效率。其实&#xff0c;咱们完全可以通过一些工具提升效率&#xff0c;为自己节约出大量时间来干别的~今天就再给大家推荐 4 个免费的 Windows 平台的…

js(Dom+Bom)第三天(2)

webAPI 0-操作标签属性 系统属性 作用: 1. 可以操作标签身上的任何一个系统中的自带属性 (id, class, name ....) 2. 还可以操作用户自定义的属性dom.getAttribute(属性名)&#xff1b; 作用: getAttribute(属性名) 方法 就是用来获取标签身上属性的备注: 1. getAttribute() 方…

xshell使用指南

shell使用指南 ZMODEM功能 yum install lrzsz rz 上传 sz 下载 快捷键 alt o 打开终端 alt 1-9 切换 ctrl alt 切换 ctrl shift n 打开新选项卡 vim的小键盘不能使用的问题 在会话的属性中&#xff0c;将VT模式的初始数字键盘设置为普通 配色方案 保存成xcs文件&#xff0c…

C#Socket编程详解(一)TCP与UDP简介

一、TCP与UDP&#xff08;转载&#xff09; 1、TCP 1.1 定义 TCP&#xff08;TransmissionControl Protocol&#xff09;传输控制协议。 是一种可靠的、面向连接的协议&#xff08;eg:打电话&#xff09;、传输效率低全双工通信&#xff08;发送缓存&接收缓存&#xff09;、…

动态创建表格数据

<input type"button" value"创建"><style>*{margin: 0;padding: 0;}table{width: 980px;margin: 50px auto;}table,th,tr,td{text-align: center;border: 1px solid #ccc;}</style><script>var heads [姓名, 年龄, 性别, 学号, 薪…

第四节:EF Core的并发处理

1.说明 和EF版本的并发处理方案一致&#xff0c;需要知道乐观并发和悲观并发的区别&#xff0c;EF Core只支持乐观并发&#xff1b;监控并发的两种方案&#xff1a;监测单个字段和监测整条数据&#xff0c;DataAnnotations 和 FluentApi的两种配置方式。 &#xff08;PS&#x…

js(Dom+Bom)第四天(1)

webAPI 1-通过DOM节点方式获取元素 1-0注意事项 下面的内容都在在文档树上直接操作的 (节点 元素)重点是: 与元素相关的内容1-1与父节点相关的操作方式 1-1-1.知识点-判断父元素中是否有子节点 语法: DOM.hasChildNodes();总结: 该方法返回的是一个布尔类型的结果该方法会…

vue官方eslint插件配置eslint-plugin-vue-libs

由于eslint-config-vue已经被废弃&#xff0c;于是总结了一下eslint-plugin-vue-libs的eslint config配置&#xff0c;如下&#xff1a; module.exports {extends: [plugin:vue/essential],plugins: [vue-libs],parserOptions: {parser: require.resolve(babel-eslint),ecmaVe…