[CLR via C#]1.4 执行程序集的代码-阿里云开发者社区

开发者社区> 杰克.陈> 正文

[CLR via C#]1.4 执行程序集的代码

简介: 原文:[CLR via C#]1.4 执行程序集的代码 1. 托管程序集同时包含元数据和IL。IL是与CPU无关的机器语言。可将IL是为一种面向对象的机器语言。 2. IL也是能使用汇编语言来写的,MicroSoft专门提供了一个名为ILAsm.exe的IL汇编器和一个名为ILDasm.exe的IL反汇编。
+关注继续查看
原文:[CLR via C#]1.4 执行程序集的代码

1. 托管程序集同时包含元数据和IL。IL是与CPU无关的机器语言。可将IL是为一种面向对象的机器语言。

2. IL也是能使用汇编语言来写的,MicroSoft专门提供了一个名为ILAsm.exe的IL汇编器和一个名为ILDasm.exe的IL反汇编。
 
3. 高级语言只公开了CLR的所有功能的一个子集,IL汇编语言允许开发人员访问CLR的所有功能。如果你需要当前使用的语言不支持的CLR功能,可以使用IL语言或者其他CLR语言。
 
4. 为了执行一个方法,首先必须将它的IL转换成为本地CPU指令,这是CLR的JIT(just-in-time或"即时")编译器的职责。
 
5. 展示一个方法首次调用发生的事情。
在Main方法执行之前,CLR会检测出Main的代码引用的所有类型。这会使CLR分配一个内部数据结构,用于管理对所引用的类型的访问。
图1-4中,Main方法引用了一个Console类型(或就叫做Console类),这将让CLR分配一个内部结构。在这个结构中,Console类型定义的每个方法都有一个相对应的记录项。每一个记录项都容纳一个地址(但目前还是没有的,还没到这一步),根据地址即可找到方法的实现。
初始化CLR分配了一个内部结构,CLR将每个记录项都设置成包含在CLR内部的一个未文档化的函数(就理解成未公开的,只有微软自己清楚的函数)。姑且就将这个函数命名为JITCompiler(MSDN找不到这个函数,为了说明流程,自己取的函数名,因为真正的函数名微软没公开)
Main方法首次调用WriteLine时,JITCompiler也就被调用了。JIT函数负责将一个方法的IL代码编译成本地CPU指令。由于IL是"即时"编译的,所有通常将这个组件成为JIT编译器或JITter。
JITCompiler函数被调用时,它知道要调用的是哪个方法,以及具体是什么类定义了该方法。于是乎,JITCompiler会在定义该类型的程序集的元数据中查找被调用的方法的IL。
接着就是验证IL代码,并将IL编译成为本地CPU指令。本地CPU指令被保存到了一个动态分配的内存块中。
然后,JITCompiler在CLR为类型创建的内部数据结构,找到与被调用的方法对应的那一条记录项,修改最初对JITCompiler的引用,让它现在指向内存块(其中包括了刚才编译好的本地CPU指令)的地址。
最后,JITCompiler函数跳转到内存块中的代码,继续执行里面的具体的功能代码,这些代码执行完后,会返回到Main中,并像往常一样继续执行。
⑧现在,Main要执行第二个WriteLine方法了。这一次,由于第一次已对WriteLine的代码进行了验证和编译,所以会直接执行内存块中的代码,完全跳过JITCompiler函数。第二个WriteLine方法执行完毕,会再次返回Main。图1-5展示了第二次调用WriteLine时发生的事。
6. 对于大多数应用程序,因JIT编译造成的性能损失并不显著。大多数引用程序会反复调用相同的方法。看到上面,你对.NET的“第一次”是否有了颠覆性的认识了。
7. CLR的JIT编译器会对本地代码进行优化,代码优化后会获得更出色的性能。
9. IL是基于栈的。这就意味着它的所有执行都要将操作数压入(push)一个执行栈,并处栈弹出(pop)结果。
10. IL提供的最大优势在于应用程序的健壮性和安全性。将IL编译成CPU指令时,CLR会执行一个名为验证(verfication)的过程。这个过程会检查高级IL代码,确定代码所做的一切都是安全的。
11. C#编译器默认生成的是安全(safe)代码,这种代码是否安全是可验证的。然而,C#编译器也允许开发人员写不安全(unsafe)代码。
12. 不安全代码允许直接操作内存地址,并可操作这些地址处的字节,通常只有在与非托管代码进行互操作,或在提升效率极高的一个算法的性能时,才会这么做。
13.  MicroSoft提供一个名为PEverify.exe的好、程序,它检查一个程序集的所有方法,并报告其中含有不安全代码的方法。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
手工部署Sqlserver CLR程序集
原文 手工部署Sqlserver CLR程序集 以前一直用VS部署Sqlserver CLR程序集简单省事,现在服务器部署在内网了,必须手动更新部署Sqlserver CLR程序集。    开始以为ALTER ASSEMBLY [程序集名称] FROM 'G:\AA\XX.dll'这样就OK,没想到出错然后查资料越弄越复杂,看来手工部署远没想象中这么简单,于是好好研究了一番最后终于成功,具体步骤是:    1.如果以前部署过当前程序集,则必须先删除引用当前程序集的所有模块(各类函数和存储过程等),然后删除当前程序集。
973 0
WebService理解和代码解析
/** WebServcie 概念 多个系统数据交换: 跨平台语言的相互通信; 如:java 的客户端 和dotnet的服务器端的接口调用: 得到接口和方法 : 基于标准的协议,可编程语言; 服务器开发 api; 特点: 自包含:只要客户端支持http和xml就可以; 自描述:只需要知道请求响应的类型; 其他的不需要考虑 跨平台:不同语言可以相互通信。
1403 0
v4l打开video设备 ,执行VIDIOC_DQBUF,出现Resource temporarily unavailable 问题【转】
转自:http://blog.csdn.net/china_video_expert/article/details/7236856 版权声明:本文为博主原创文章,未经博主允许不得转载。 如果你在执行VIDIOC_DQBUF突然提示以下错误: error: VIDIOC_DQBUF: Resource temporarily unavailable 那么很可能是你使用非阻塞方式打开设备文件的造成的。
985 0
Linux基础命令---mail邮件管理程序
mail mail是一个邮件的管理程序,可以用来发送或者接收邮件。 此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、Fedora。 1、语法 mail [选项] addr 2、参数列表 -a file 将给定的文件发送出去 -b ...
963 0
+关注
杰克.陈
一个安静的程序猿~
10427
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载