CLR:是一个可由多种编程语言使用的“运行时”。

CLR的核心功能(比如 内存管理、程序集加载、安全性、异常处理、线程同步)可由面向CLR的所有语言使用。

CLR是完全围绕类型展开的。

面向CLR的语言编译器:

Microsoft:C++/CLI、C#、Visual Basic、F#、Iron Python 以及IL汇编器。

其他公司、学院:Ada、PAL、Caml、COBOL、LOGO、PHP...

托管模块的组成部分:PE32/PE32+头、CLR头、元数据、IL代码。

IL基于栈的。

IL指令时“无类型”(typeless)的

IL提供的优势:应用程序的健壮性和安全性,对底层CPU的抽象。

将IL编译成本地CPU指令时,CLR会执行一个名为验证的过程。(检查高级IL代码,确定代码所做的一切都是安全的。)

在托管模块的元素中,包含了要由验证过程使用的所有方法和类型信息。

在Windows中,每个进程都有它自己的虚拟地址空间。(保证程序的健壮性,稳定性;一个进程无法干扰另一个进程)

托管代码相较于非托管代码的优势:在一个操作系统进程中运行多个应用程序,可减少进程数,从而增强性能(windows进程需要使用大量操作系统资源)。

不安全代码 使用场景:直接操作内存地址的代码称为不安全代码,并可操作这些地址处的字节。通常只有在与非托管代码进行互操作,或者在提升对效率要求极高的一个算法的性能的时候,才需要这样做。

不安全代码 风险:可能破坏数据结构,危害安全行性,甚至可能造成新的安全漏洞。

C#编译器要求包含不安全代码的所有发明合法都用unsafe关键字标记,要求使用/unsafe编译器开关来编译源码。

本地代码生成器:NGen.exe

1.作用:

加快应用程序的启动速度。

减小应用程序的工作集。

2.NGen生成的文件存在的问题:

没有知识产权保护。

NGen生产的文件可能失去同步。

较差的执行时性能。

正是因为存在上述这些问题,所以在考虑shiyNGen.exe时,务必非常谨慎。对于服务器端的应用程序,NGen.exe的作用并不明显,甚至毫无用处,这是因为只有第一个客户端请求才会感受到性能的下降,后续的所有客户端请求都能以全速运行。此外,对于大多数服务器应用程序,由于只需要代码的一个实例,所以无法从工作集的缩小中获得任何好处。还需要注意,NGen.exe2.0之前生成的映像不能在不提部分的AppDomain之间共享。因此,如果一个程序集要在跨AppDomain的环境中使用(比如ASP.NET),用NGen来生成它是没有任何好处的。(不过,这一限制在NGen2.0之后已经不存在了。)

对于客户端的应用程序,也许能用NGen.exe加快启动速度,或者缩小工具集(如果程序集同时由多个应用程序使用)。即使一个程序集不是由多个应用程序使用,用NGen来生成它,也有助于增强工作集。此外,假如用NGen.exe来生成一个客户端应用程序的所有程序集,CLR根本不需要加在JIT编译器,从而进一步缩小工作集,当然,只要有一个程序集不是用NGen生成的,或者程序集的一个由NGen声生成的文件无法使用,那么还是会加载JIT编译器,应用程序的工作集将随之增大。

Framework类库

.NET Framework 中包含了Framework类库(Framework Class Library)。FCL是一组DLL程序集的统称,其中含有数千个类型定义,每个类型都公开了一些功能。

下面列举了应用程序开发人员可以利用这些程序集创建的一部分应用程序:

Web Service

Web Form

Windows应用程序

RIA

Windows控制台应用程序

Windows服务

数据库存储过程

组件库

所有的应用程序都要使用来自System命名空间的类型。

部分常规的FCL命名空间
命名空间 内容说明
System 包含每个应用程序都要用到的所有基本类型
System.Data 包含用于和数据库通信以及处理数据的类型
System.IO 包含用语执行流I/O以及浏览目录/文件的类型
System.Net 包含进行低级网络通信,并与一些常用Internet协议协作的类型
System.Runtime.InteropService 包含允许托管代码访问非托管操作系统平台功能(比如COM组件以及Win32或定制DLL中的函数)的类型
System.Security 包含用语保护数据和资源的类型
System.Text 包含处理各种编码方式(比如ASCII和Unicode)的文本的类型
System.Threading 包含用于异步操作和同步资源访问的类型
System.Xml 包含用于处理XML架构(XML Schema)和数据的类型

通用类型系统CTS

CLR是完全围绕类型展开的。CTS描述了类型的定义和行为。

CTS规则:

1.CTS规范规定一个类型可以包含零个或者多个成员。(成员包括:字段、方法、属性、事件)

2.CTS指定了类型可视性规则以及类型成员的访问规则。(private、protected、internal、public...)

3.CTS为类型继承、虚方法、对象生存期等定义了相应规则。

4.所有的类型最终必须从预订一的System.Object类型继承。

System.Object类型允许做的事情:

1)比较两个实例的相等性。

2)获取实例的哈希码。

3)查询一个实例的真正类型。

4)执行实例的浅(按位)拷贝。

5)获取实例对象的当前状态的一个字符串表示。

公共语言规范CLS

COM允许使用不同的语言创建对象的相互通信。CLR可以集成所有语言,允许在一中语言中使用另一种语言创建的对象。之所以能实现这样的集成,是因为CLR使用了标准类型集、元数据(自描述的类型信息)以及公共执行环境。

CLS:CLS详细定义了一个最小功能集。任何编译器生成的类型要想兼容雨由其他“符合CLS、面向CLR的语言”所生成的组件,就必须支持CLS定义的这个最小功能集。

每种语言都提供了CLR/CTS的一个子集以及CLS的一个超集(但不一定是同一个超集)。

一种语言定义一个类型时,如果希望在另一种语言中使用该类型,就不要在该类型的public和protected成员中使用位于CLS外部的任何功能。否则,其他开发人员使用其他语言写代码时,就可能无法访问这个类型的成员。

托管代码与非托管代码的互操作性

CLR支持三种互操作的情形:

1.托管代码能够调用DLL中的非托管代码

2.托管代码可以使用现有的COM组件(服务器)

3.非托管代码可以使用托管类型(服务器)

CLR via C#--------CLR的执行模式的更多相关文章

  1. 【深入理解CLR】1:CLR的执行模型

    将源代码编译成托管模块 下图展示了编译源代码文件的过程.如图所示,可用支持 CLR 的任何一种语言创建源代码文件.然后,用一个对应的编译器检查语法和分析源代码.无论选用哪一个编译器,结果都是一个托管模 ...

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

    原文:[CLR via C#]1.4 执行程序集的代码 1. 托管程序集同时包含元数据和IL.IL是与CPU无关的机器语言.可将IL是为一种面向对象的机器语言. 2. IL也是能使用汇编语言来写的,M ...

  3. 【CLR】解析CLR的托管堆和垃圾回收

    目录结构: contents structure [+] 为什么使用托管堆 从托管堆中分配资源 托管堆中的垃圾回收 垃圾回收算法 代 垃圾回收模式 垃圾回收触发条件 强制垃圾回收 监视内存 对包装了本 ...

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

    CLR是Common Language Runtime的缩写,是.NET程序集或可执行程序运行的一个虚拟环境.CLR用于管理托管代码,但是它本身是由非托管代码编写的,并不是一个包含了托管代码的程序集, ...

  5. clr via c# clr寄宿和AppDomain (一)

    1 clr寄宿-----.net framework在windows平台的顶部允许.者意味着.net framework必须用windows能理解的技术来构建.所有托管模块和程序集文件必须使用wind ...

  6. [实践] Android5.1.1源码 - 让某个APP以解释执行模式运行

    [实践] Android5.1.1源码 - 让某个APP以解释执行模式运行   作者:寻禹@阿里聚安全 前言 本文的实践修改了Android5.1.1的源码. 本文只简单的讲了一下原理.在“实践”一节 ...

  7. python之fabric(二):执行模式(转)

    执行模式 执行模式可以让你在多个主机上执行多个任务. 执行策略: 默认fabric是单个有序地执行方法,其行为如下: 1. 创建一系列任务,通过fab任务执行要执行的任务: 2. 根据主机列表定义,去 ...

  8. 脚本可执行,但无HTML测试报告文件生成,其造成的原因是在PyCharm的执行模式错误

    定义测试报告两种写法: 1)测试报告直接在本地绝对路径下生成 # 导入HTMLTestRunner模块 import HTMLTestRunner # 通过open()方法以二进制写模式('wb')打 ...

  9. JIT与JVM的三种执行模式:解释模式、编译模式、混合模式

    Java JIT(just in time)即时编译器是sun公司采用了hotspot虚拟机取代其开发的classic vm之后引入的一项技术,目的在于提高java程序的性能,改变人们“java比C/ ...

  10. jvm内存结构(二)(栈的变化,机器指令的格式/执行模式)

    栈的结构: <Java虚拟机原理图解>4.JVM机器指令集 局部变量表: 方法执行时,虚拟机会把字节码中方法数据区的code类型的属性中的局部变量放到栈的局部变量表中. 操作栈: jvm指 ...

随机推荐

  1. sublime-text3按tab跳出括号

    功能 通过按tab自动跳过右括号,右引号,虽然也可以按右方向键,但离得太远按起来太麻烦 在首选项->按键绑定里添加: { "keys": ["tab"], ...

  2. C++重载操作符自增自减

    #include <iostream> using namespace std; class Test { friend ostream& operator<<(ost ...

  3. SpringMvc HandlerMethodResolver 的 handlerMethods & ServletHandlerMethodResolver 的 mappings 在哪里初始化的 ?

    HandlerMethodResolver 的 handlerMethods & ServletHandlerMethodResolver 的 mappings 在哪里初始化的 ? 如下图:

  4. HSV to RGB

    HSV构成: Hue : the color type (red, blue, or yellow) Ranges from 0 to 360° Saturation : the intensity ...

  5. python 竖排文本

    新建目录train,并将目录data和data1复制到train下 python test data/,data1/ 目录data和data1中包含很多文件,文件中内容都是以空格分隔,将所有文件内容都 ...

  6. K8S学习笔记之ETCD启动失败注意事项

    最近搭建K8S集群遇到ETCD的报错,报错信息如下,一定要关闭防火墙.iptables和SELINUX,三个都要关闭!! Mar 26 20:39:24 k8s-m1 etcd[6437]: heal ...

  7. poj2142 The Balance

    poj2142 The Balance exgcd 应分为2种情况分类讨论 显然我们可以列出方程 ax-by=±d 当方程右侧为-d时,可得 by-ax=d 于是我们就得到了2个方程: ax-by=d ...

  8. Html select、option、optgroup 标签

    Html select 标签 </body> </html> <!-- select外部下拉选择框.name="xxx"标识后端获取名称 --> ...

  9. mysql-5.7.17-winx64压缩版的安装包下载和安装配置

    网上有很多的安装配置步骤,但是一个跟一个遇到的问题不一样,总之越是写的完整的人,遇到的错误越多,在安装过程中也就越悲催!第一步:下载mysql安装包---下载网址https://downloads.m ...

  10. rabbitmq 配置集群镜像