.NET 框架基本原理透析⑴

.NET框架的核心便是通用语言运行时(CLR),顾名思义它是一个可被各种不同的编程语言所使用的运行时.CLR的很多特性可用于所有面向它的编程语言.比如,如果CLR用异常来报告错误,那么所有面向它的语言都将通过异常来得到错误报告.如果CLR允许我们创建线程,那么所有面向它的语言也都可以创建线程.在实际中,CLR在运行时对开发人员用何种编程语言来完成源代码一无所知.这意味着我们应该选择那些能够最容易表达我们意图的编程语言.我们可以用任何自己喜欢的语言来编写代码,前提是我们使用的编译器能够面向CLR的代码.

针对c#:   c#源代码文件(.cs)→c#编译器→托管模块(IL和元数据) .最终是将源代码编译为托管模块.托管模块是一个需要CLR才能执行的标准Windows可移植执行文件(PE).

PE的各个组成部分:

①PE表头:该表头指出了文件类型,比如GUI和DLL,另外还包括一个时间标记用于表示文件创建日期,对于仅包含IL代码的模块,该表头的大多数信息会被忽略.对于包含本地CPU代码的模块,该表头还会包含有关本地CPU代码的一些信息.

②CLR表头:包含标识托管模块的一些信息(可以被CLR或者一些实用工具解析).这些信息包括托管模块所需要的CLR版本号,一些标记,托管模块入口点方法(Main)方法的MethodDef元数据标记,以及有关模块的元数据、资源、强命名、标记和其他一些意义不是太大的信息的位置和尺寸.

③元数据 每个托管模块都包含一些元数据表.元数据表主要分两种,一种用于描述源代码中定义的类型和成员,一种用于描述源代码中引用的类型和成员

④中间语言(IL)代码 编译器在编译源代码时产生的指令.CLR在运行时会将IL代码编译成本地CPU指令.

由于生存期和执行行为受CLR管理的缘故,IL代码有时也被称为托管代码.实际上元数据总是和这些IL代码一起被嵌入到同一个EXE/DLL文件中,两者根本不能分离.因为编译器总是同时产生元数据和IL代码,并且总是同时将它们嵌入到生成的托管模块中,所以元数据和它描述的IL代码之间总能保持同步.

元数据的作用:

1.元数据省去了源代码编译时对头文件和库文件的需求,这是因为在含有实现类型和成员的IL代码文件中,已经包含了所有被引用的类型和成员的信息.编译器可以直接从托管模块中读取元数据来获得这些信息.

2.VS可以利用元数据来辅助我们编写代码.它的智能感知特性就是通过分析元数据来告诉我们某个类型提供了哪些方法,以及某个方法有哪些参数.

3.CLR的代码验证过程可以利用元数据来确保代码仅执行"安全"操作.

4.利用元数据,我们可以将一个对象的字段序列化到一个内存中,然后远程传送给另一台机器,最后再在远程机器上执行反序列化,从而重新创建对象和它的状态.

5.利用元数据,垃圾收集器可以追踪对象的生存期.对于任何对象,垃圾收集器都能够通过元数据来确定该对象的类型,并且可以获知该对象的哪些字段引用了其他对象.

程序集

    CLR其实并不和托管模块打交道,它直接打交道的对象是程序集.程序集是一个抽象的概念,刚开始往往很难理解.首先,程序集是一个或多个托管模块,以及一些资源文件的逻辑组合.其次,程序集是组件复用,以及实施安全策略和版本策略的最小单位.根据我们对编译器和相关工具所做的选择,程序集可以是一个文件或者多个文件.

当生成一个EXE程序集时,编译器/链接器会产生一些特殊的信息,并将它们嵌入到结果程序集的PE文件表头及其各个组成文件的.text部分.当EXE文件被调用时,这些特殊的信息将导致CLR被加载并初始化.CLR随后会定位到应用程序的入口点方法,从而以此来启动应用程序.类似地,如果一个非托管应用程序通过调用LoadLibrary来加载一个托管程序集,那么该托管程序集DLL的入口点函数也会知道去加载CLR来处理包含其中的代码. 加载原理如下:

时间: 2024-11-05 18:58:30

.NET 框架基本原理透析⑴的相关文章

NET 框架基本原理透析⑵

生成.打包.部署及管理应用程序与类型 要生成就离不开程,序集,程序集是包含一个或多个类型定义文件和资源文件的集合.在程序集包含的所有文件中,有一个文件用于保存清单.清单是另外一组元数据表的集合,其中主要包含了程序集中一部分文件的名称.另外清单描述了程序集的版本.语言文化.发布者.公有导出类型.以及组成该程序集的所有文件. 程序集是CLR操作的对象.也就是说,CLR总是先加载包含清单元数据表的文件,然后利用该清单来获取程序集的其他文件.下面是一些应该牢记的程序集特性: •程序集定义了可重新的类型

从经典架构项目中透析微服务架构的核心概念和充血模型

微服务架构和SOA区别 微服务现在辣么火,业界流行的对比的却都是所谓的Monolithic单体应用,而大量的系统在十几年前都是已经是分布式系统了,那么微服务作为新的理念和原来的分布式系统,或者说SOA(面向服务架构)是什么区别呢? 我们先看相同点: 需要Registry,实现动态的服务注册发现机制:需要考虑分布式下面的事务一致性,CAP原则下,两段式提交不能保证性能,事务补偿机制需要考虑:同步调用还是异步消息传递,如何保证消息可靠性?SOA由ESB来集成所有的消息:都需要统一的Gateway来汇

透析Java本质-谁创建了对象,this是什么

Android系统手机屏幕的左上角为坐标系,同时y轴方向与笛卡尔坐标系的y轴方向想反.通过提供的api如getLeft , getTop, getBottom, getRight可以获得控件在parent中的相对位置.同时,也可以获得控件在屏幕中的绝对位置,详细用法可参考android应用程序中获取view的位置 当我们编写一些自定义的滑动控件时,会用到一些api如scrollTo(),scrollBy(),getScrollX(), getScrollY().由于常常会对函数getScroll

数据分析处理——透析表和交叉表

1透视表 数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等.所进行的计算与数据跟数据透视表中的排列有关. 之所以称为数据透视表,是因为可以动态地改变它们的版面布置,以便按照不同方式分析数据,也可以重新安排行号.列标和页字段. 数据分析中的透析表十分强大,甚至可以说是相当于分组聚合外加哑变量三个步骤了.但有个前提就是:在使用透析表之前,你必须明确知道自己想要的是什么,需要做什么! 当然,有时候你很难直接看出需求.这时候我们就得添加项目和检查每一步来验证我们一步

2019-2025全球与中国透析溶液市场现状及未来发展趋势

本报告研究全球与中国市场透析溶液的发展现状及未来发展趋势,分别从生产和消费的角度分析透析溶液的主要生产地区.主要消费地区以及主要的生产商.重点分析全球与中国市场的主要厂商产品特点.产品规格.不同规格产品的价格.产量.产值及全球和中国市场主要生产商的市场份额. 主要生产商包括: Fresenius Baxter B. Braun Haemo Pharma Nipro Unipharm JSC Rockwell Medical 针对产品特性,本报告将其分为下面几类,主要分析这几类产品的价格.销量.市

【资源分享】透析表

今日分享excel的透析表内容 链接: https://pan.baidu.com/s/1vCST7la0V_5wX0T1aZzHnw 原文地址:https://www.cnblogs.com/zhoujianjie1988/p/11330324.html

960CSS框架,之前有用过 了解下框架基本原理

http://blog.sina.com.cn/s/blog_8173443e010160b8.html CSS框架已经出现很长时间了,关于这些框架的用处也被我们讨论了很多遍了.有人说,CSS框架不够先进,还有人说这些框架大大的节省了他们的开发时间.在此,我们将不再讨论这个问题. 前段时间,我了解到了CSS框架.我最喜欢960CSS框架. 本教程将解释这个框架的基本原理,这样你就可以用960来快速进入开发. 基本原理 你必须知道一些基本原理来“学习这个框架是如何工作的”.你可以通过实验(或者是用

【struts1】--Servlet讲解MVC框架基本原理

1.开始 根据路径的不同,调用不同的jsp地址——> 把行为封装到不同的Action里面,Test分个调用各个Action,if..else并没有解决.——> 把变化的Action和需要跳转的jsp都写入xml文件里面——> 配置文件,反射——> mvc Struts大体思路如下: 1.中央控制器,最高指挥官:1)收到指示(URL访问),截取URL   2)通过URL解析,分发到对应的Action. Servlet发送,接收一个请求. 1.web客户端发送request到tomca

Cordova框架基本原理

最近在做混编项目,也是从项目里开始接触Cordova框架,网上很多帖子都总结的很好,我还是要总结一下,便于加深一下. Cordova框架是一个可以让JS与原生代码(包括 Android 的 java,iOS 的 Objective-C 等)互相通信的一个库,并且提供了一系列的插件类,比如 JS 直接操作本地数据库的插件类. 要想明白它是如何互相通信的需要弄清楚下面三个问题: 1.JS怎么跟Objective-C通信 2.Objective-C怎么跟JS通信 3.JS请求Objective-C,O