c# 深入探索之CLR
概念:
CLR :
公共语言运行时(Common Language Runtime) 是一个可由多种编程语言使用的"运行时",它负责资源管理(内存分配和垃圾收集等),并保证应用和底层操作系统之间必要的分离。CLR的核心功能(内存管理、程序集加载、安全性、异常处理和线程同步)可由面向CLR的所有语言使用。
通俗一点说就是:不管是c# 、c++、 vb、f#、甚至是java等各编译器面向CLR的语言,都可以借用CLR里已经实现的核心功能。
例如:CLR使用异常报告错误,因此,面向它的任何语言都能通过异常来报告错误;CLR允许创建线程,所以面向它的任何语言都能创建线程
托管模块:
用支持CLR的任何一种语言创建的源代码文件,再经过相应的编译器检查语法和分析源代码,编译生成。
是一个标准的32位的可移植执行体(PE32)文件或一个标准的64位可移植执行体(PE32+)文件,它们都需要CLR才能执行。下图:是将源代码编译成托管模块的过程

托管模块的组成:

以上是关于托管模块高大上版本的介绍,以下我再接地气的以C#语言作为主角介绍以下
程序员写完一段优美的c#代码后,会通过自带的编译器编译,生成托管模块,托管模块在一个可移植的PE文件中(如 .exe 、.dll)
PE文件里的托管模块,你可以当做c#的一个类,类里有四个属性,一个PE头(介绍该文件的信息),一个CLR头(描述这个对象的整体的一些信息,比如main入口),元数据(这个很关键,一种元数据表包含源代码中定义的那些那些类型和成员的描述信息,另一种包含引用的类型和成员的描述信息),IL代码(也很关键:就是你的源代码被编译后的代码,又称中间语言)。
托管模块的主要组成就是IL与元数据: IL代码有时候也叫托管代码,因为CLR管理它的执行 元数据就是对这段c#源代码的描述
元数据有很多用途:其中有一条大家肯定晓得: Microsoft Visual Studio 用元数据帮助你写代码。“智能感知”(IntelliSense)技术会解析元数据,告诉你一个类型提供了那些方法、属性、事件和字段。对于方法,还能告诉你需要的参数。
托管模块可合并成为程序集
程序集(assembly)是一个抽象概念:
由一或者多个模块/资源文件的逻辑性组合。程序集是重用、安全性以及版本控制的最小单元。在CLR世界中,程序集相当于“组件”。托管模块合并程序集如下图

该图将 一些托管模块 与 一些资源文件 交给一个工具处理,生成一个PE32(+)文件,这些托管模块与资源文件合并到了一起,并多了一个清单(清单的作用类似于元数据对托管代码的作用)。
执行程序集:
程序集同时包含 元数据与IL。IL是与CPU不相关的代码,不是机器语言,计算机无法运行,这个时候就需要强大的CLR了!
c# 深入探索之CLR的更多相关文章
- 深入探索.NET框架内部了解CLR如何创建运行时对象
原文地址:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx 原文发布日期: 9/19/2005 原文已经被 Microsoft 删除了,收集 ...
- 深入探索.NET内部了解CLR如何创建运行时对象
前言 SystemDomain, SharedDomain, and DefaultDomain. 对象布局和内存细节. 方法表布局. 方法分派(Method dispatching). 因为公共语言 ...
- CLR探索应用程序域世界(上):Windbg SOS剖析揭示域世界
在CLR的世界中,有一系列的令人Amazing的技术和架构.其中,CLR对应用程序在内存中内存分配,执行模型,程序之间的交互等一系列的技术,值得每一个致力于DotNet平台的技术人员深究. 编程人员在 ...
- CLR探索系列:Windbg+SOS动态调试分析托管代码
http://blog.csdn.net/garyye/article/details/4788070 在使用VS进行托管应用程序的调试的时候,有的时候总感觉有些力不从心.譬如查看一个托管堆或者计 ...
- C++随笔:.NET CoreCLR之GC探索(2)
首先谢谢 @dudu 和 @张善友 这2位大神能订阅我,本来在写这个系列以前,我一直对写一些核心而且底层的知识持怀疑态度,我为什么持怀疑态度呢?因为一般写高层语言的人99%都不会碰底层,其实说句实话, ...
- ASP.Net请求处理机制初步探索之旅 - Part 1 前奏
开篇:ASP.Net是一项动态网页开发技术,在历史发展的长河中WebForm曾一时成为了ASP.Net的代名词,而ASP.Net MVC的出现让这项技术更加唤发朝气.但是,不管是ASP.Net Web ...
- “菜”鸟理解.NET Framework(CLI,CLR,CTS,CLS,BCL,FCL)
既然要学.NET,就要先认识认识她,我不喜欢大段大段文字的东西,自己通过理解,画个图,来看看.NET的沉鱼落雁,闭月羞花之容. 最下层蓝色部分是.NET Framework的基础,也是所有应用软件的基 ...
- .NET CLR 运行原理
原文: Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects 文章讨论了: SystemDoma ...
- ASP.Net请求处理机制初步探索之旅 - Part 1 前奏(转)
在读本文之前建议先阅读IIS架构:http://www.cnblogs.com/tiantianle/p/5079932.html 不管是ASP.Net WebForm还是ASP.Ne ...
随机推荐
- adb环境变量配置
针对win10系统: 搜索“高级系统设置”,点击“环境变量”按钮: 找到“path”双击: 双击“path”,在弹出的环境变量列表中新建,填入adb的文件路径 检查配置是否成功,运行命令adb,出现如 ...
- Database学习 - mysql 数据库 事务操作
事务 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 数据库开启事务命令: start transaction 开启事务 rollback 回滚事务,即撤销指定的 ...
- python - 用类写装饰器
这里用到了__call__的class内置参数 #类装饰器: class zsq(): #本质是定义一个参数,让装饰的主题传递至__call__方法内部 def __init__(self,obj): ...
- maven插件的使用
maven插件官网: https://maven.apache.org/plugins/index.html 1.JDK插件的使用 <build> <plugins> < ...
- POST 上传 JSON 数据
// // ViewController.m // 03-post上传json // // Created by jerry on 15/10/10. // Copyright (c) 2015年 j ...
- Python|绝不乱入的靠谱书单
- Linux内核驱动之延时 【转】
转自:http://blog.chinaunix.net/uid-24219701-id-3288103.html jiffies 计数器 定时器中断由系统定时硬件以规律地间隔产生; 这个间隔在启动 ...
- openwrt 添加luci选项
刚刚下载的openwrt trunk版本,安装后没有luci选项,如下图 需要添加luci页面选项. 步骤如下: (1)修改配置文件 .config , 将 CONFIG_FEED_luci is n ...
- 重新学习angularjs--第一篇(入门)
几乎是一年之前,泛泛接触了angularjs,也做了一些项目,但是时至今日,几乎已经忘记了ng的使用,由于业务需要,近日要攻克这座难关,重新学习.会把学习的一些东西拿出来,记录之. angularjs ...
- FreeSWITCH与PSTN对接
FreeSWITCH与PSTN电话系统对接设定 一.环境介绍 我们目前使用模拟的话机连接到电信运营商,购买他们配套的电话总机,勉强实现了公司的基本通话.但是客户电话总机系统以及升级添加新的应用不但费用 ...