四、CLR执行程序集中代码和IL代码简介
三、加载公共语言运行时中介绍了在安装了.Net Framework中加载公共语言运行时,公共语言运行时加载程序集的过程.以及通过vs stdio设置源码编译的目标平台的过程.
本问主要介绍公共语言加载完程序集之后,执行程序集中的代码的过程.
一、IL中间语言
1、IL简介
一、源代码-面向CLR的编译器-托管模块-(元数据&IL代码)中介绍了C#源代码通过C#编译器生成的最终产物是托管模块,而托管模块是由IL中间语言和元数据组成,IL语言是比大多数机器语言都要高级的语言,IL有以下功能:
(1)、能访问和操作对象类型
(2)、提供了指令创建和初始化对象
(3)、调用对象上的虚方法和操作数组
(4)、提供了抛出和捕捉异常的指令实现错误处理
......等等
因此,可将IL视为一种面向对象的机器语言.
2、IL通识
(1)、我们一般通过C#或者F#或者Visual Basic来编程,然后编译器将它们编译成IL,然后IL和其他机器语言一样,也可以使用汇编语言来编写,MS提供了ILAsm.exe的IL汇编器和ILDasm.exe的反汇编器.
(2)、通常高级语言只提供CLR全部功能的一个子集,然而IL汇编语言允许开发人员方法CLR的全部功能,如果你选择的编程语言隐藏了一个你迫切需要的功能,那么你可以使用IL汇编语言来实现,或者使用另一种编程语言来实现
3、CLR执行一个方法时发生的事情
(1)、第一次执行
(2)、第二次执行
如果Main方法第二次调用Console的WriteLine方法,会完全跳过JITComliler函数,因为第一次已经执行和初始化过了,会执行执行内存块中的代码,执行完毕有返回值,则返回到Main(),没有返回值,则跳转带Main方法,进行下一步操作.
注:方法只有在第一次运行时会有JIT进行IL验证和IL编译成本机代码造成的性能损失,以后对该方法的调用都已本机代码的形式全速运行,无需验证IL代码并把它编译成本地代码.
4、CLR执行方法时的IL和验证
(1)、IL基于栈
它的所有指令要将操作数压入一个执行栈,并从栈中弹出(pop)结果。由于IL没有提供操作寄存器的指令,所有人们很容易的创建新的语言和编译器,生成面向CLR的代码.
(2)、IL指令"无类型"
例:IL提供了Add指令将压入栈的最后的两个操作数加到一起.add指令不分32位和64位版本.当add指令执行时,它判断栈中的操作数的类型,并执行恰当的操作.
(3)、IL指令最大的优势
IL最大的优势并不是对底层的抽象,而是应用程序的健壮性和安全性.将IL编译成本机CPU指令时,CLR会检查验证高级IL代码,确定代码所做的一切操作都是安全的.
例如:会核实调用的每个方法都有正确数量的参数,传给每个方法的每个参数都有正确的类型,每个方法的返回值都得到了正确的使用,每个方法都有一个返回语句.
注:托管模块的元数据包含验证过程要用到的所有方法及类型信息.
(4)、IL验证对进程产生的影响
windows的每个进程都有自己的虚拟地址空间,独立空间存在的是因为不能简单的信任一个应用程序的代码。应用程序完全可能读写无效的内存地址。将每个Windows进程都放到独立的地址空间,将获得健壮性和稳定性,一个进程干扰不到另一个进程.
通过验证托管代码,可以确保代码不会不正确地访问内存,不会干扰另一个应用程序的代码.这样就可以放心地将多个托管应用程序放到同一个Windows虚拟地址空间运行。
注:由于windows进程需要大量的操作系统资源,所以进程数量太多,会损害性能并制约可用的资源。用一个进程运行多个应用程序,减少进程,增强性能,减少所需的资源,健壮性没有丝毫下降,这是托管代码的优势之一.
CLR提供了在一个操作系统进程中执行多个托管应用程序的能力,每个应用程序都在一个AppDomain中执行,每个托管Exe文件默认都在它自己的独立地址空间中运行,这个地址空间已有一个AppDomain.
注:IIS和SQL Server可实现在一个进程中运行多个AppDomain.
5、CLR执行不安全的代码
C#编译器默认生成安全的代码,代码的安全性可以验证,然而C#编译器也允许开发人员写不安全的代码,不安全的代码允许直接操作内存,并可操作这些地址处的字节。这是一个很强大的功能,不过一般是在提升一个对效率要求极高的算法的时候使用。
然而,使用不安全的代码存在重大风险,这种代码可能会破坏数据结构,危害安全性,甚至造成新的安全漏洞,所以,C#编译器要求不安全的代码都使用unsafe关键字标记.
注:当JIT编译器编译一个unsafe方法时,该程序集必须有System.Security.Permissions.SecurityPermission权限.且System.Security.Permissions.SecurityPermissionFlagd的SkipVerification的标志是否设置,如果设置了,JIT编译器会便宜unsafe的代码.
MS提供了PEVerify.exe的程序,用它检查一个程序集的所有方法,并报告其中不安全代码的方法.
6、实现IL代码验证的技术
JIT验证IL代码时.必须要访问所有以来的程序集中包含的元数据.例如:当PEVerify检查程序集时,它必须能够定位并加载应用的所有的程序集.
CLR是采用和平时执行程序集时一样的绑定和探测规则来定位程序集.
四、CLR执行程序集中代码和IL代码简介相关推荐
- 基于mono.ceil对c#进行注入垃圾代码,混淆代码,IL代码注入
前言 unity的c#层,编译处理的程序集Assembly_CSharp.dll,通过dnspy反编译出来,可以看到自己写的代码,代码也是公司的财产(大雾,这不是我说的),但是开发项目过程中,有什么方 ...
- MSIL入门(一)C#代码与IL代码对比
基础概念 Microsoft中间语言(MSIL),也成为通用中间语言(CIL),是一组与平台无关的指令,由特定于语言的编译器从源代码生成.MSIL是独立于平台的,因此,他可以在任何公共语言基础架构支持 ...
- [你必须知道的.NET]第十四回:认识IL代码---从开始到现在
本文将介绍以下内容: · IL代码分析方法 · IL命令解析 · .NET学习方法论 1. 引言 自从『你必须知道.NET』系列开篇以来,受到大家很多的关注和支持, ...
- CLR基础,CLR运行过程,使用dos命令创建、编译、运行C#文件,查看IL代码
CLR是Common Language Runtime的缩写,是.NET程序集或可执行程序运行的一个虚拟环境.CLR用于管理托管代码,但是它本身是由非托管代码编写的,并不是一个包含了托管代码的程序集, ...
- C 设计语言编译生成的是中间语言IL,一、源代码-面向CLR的编译器-托管模块-(元数据IL代码)...
本文脉络图如下: 1.CLR(Common Language Runtime)公共语言运行时简介 (1).公共语言运行时是一种可由多种编程语言一起使用的"运行时". (2).CLR ...
- .Net IL代码研究
参考文章:http://www.cnblogs.com/zery/p/3366175.html 对于IL代码没了解之前总感觉很神奇,初一看完全不知所云,只听高手们说,了解IL代码你能更加清楚的知道你的 ...
- 详解.NET IL代码(一)
本文主要介绍IL代码,内容大部分来自网上,进行整理合并的. 一.IL简介 为什么要了解IL代码? 如果想学好.NET,IL是必须的基础,IL代码是.NET运行的基础,当我们对运行结果有异议的时候,可以 ...
- 揭开IL代码的神秘面纱--进阶篇(一)
系列文章目录 揭开IL代码的神秘面纱--基础篇(一) 揭开IL代码的神秘面纱--基础篇(二) 揭开IL代码的神秘面纱--进阶篇(一) 持续更新中...... 工具 IL指令大全 IL指令分类 IL代码 ...
- java 方法引用无效_InvalidProgramException:调用方法时无效的IL代码
我收到此运行时错误: InvalidProgramException: Invalid IL code . 我正在使用unity 5.3.1f1 . 该项目是编辑器扩展 . 代码的简化版本是: pub ...
最新文章
- 支持向量机(SVM):超平面及最大间隔化、支持向量机的数学模型、软间隔与硬间隔、线性可分支持向量机、线性支持向量机、非线性支持向量机、核函数、核函数选择、SMO算法、SVM vs LR、优缺点
- createDocumentFragment
- 【C 语言】文件操作 ( 配置文件读写 | 框架搭建 | 写出或更新配置文件 | 读取配置文件 )
- 使用 github 和 jitpack 构建 android 依赖
- 一个页面中多个window.onload = function(){}冲突问题解决思路
- 如何对ABAP SE80 workbench做增强
- 上班从不迟到,生病不敢请假,加班唯命是从,明明已经很拼命了,为什么还是缺钱?...
- 【计算机就业-算法工程师】校招想去互联网公司担任算法工程师该怎么准备
- maven构建java web项目(idea开发)
- Unity官方宣传片Adam 播放地址
- MyBatis 【中文编码问题】
- mysql query语句_使用mysql_query()函数执行SQL语句
- ElementUI 按需引入坑爹的点记录
- intelliJ idea 激活和配置
- 苹果电脑取色器怎么用?Mac取色器——为你的设计提提速
- 【BZOJ1500】[NOI2005]维修数列
- directx修复工具v3.2增强版_「电脑知识」USBOS 超级PE启动维护工具增强版及标准版...
- Spring框架的本质:3了解一点儿JavaConfig
- 第一期:浙大版《JAVA语言程序设计教程》(第二版)翁凯等 主编 ——小白的入门之路(上)(一)
- 解决Ubuntu设置静态ip网络连接失败的问题
热门文章
- java --微信支付2
- 6.4 Ext.core.DomQuery 单实例查询选择器,通过正则表达式查找DOM或者HTM
- F5和nginx配合转发前端请求
- windows知识点
- 严重的“Access:7”供应链漏洞影响100多家厂商150多款联网设备等产品
- 速修复!21个漏洞影响60%的互联网邮箱服务器
- RCE 0day影响数万台QNAP SOHO NAS 设备
- 开源的 DNS 转发软件 Dnsmasq 被曝7个漏洞,可劫持数百万台设备
- 根文件系统移植之使用busybox
- 前端存储 (2) - sessionStorage ,localStorage