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 ...
随机推荐
- 2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限
2017-2018-2 『网络对抗技术』Final:Web渗透获取WebShell权限 --------CONTENTS-------- 一.Webshell原理 1.什么是WebShell 2.We ...
- Java用System读取系统相关信息、环境变量——(六)
package Java_Test; public class System1 { public static void main(String[] args) { // TODO Auto-gene ...
- Vim中自动在程序起始处添加版权和作者信息
在编写程序的时候,经常需要在程序开始写上程序的简要介绍和作者信息,如下: 这种信息,除了文件名和修改时间可能经常发生变化外,其他基本不变,可以在程序开始自动加入,方法就是在家目录下的.vimrc中写入 ...
- WPF版公司的自动签到程序
1.外包公司要求早上签到,就写了一个自动打卡程序. 2.一直都想写这个程序,可是一直没有思路,知道有个软件公司找我做自动答题程序,于是自动打卡程序才应运而生.未来可以将自动答题程序开源工大家查看. 3 ...
- C++学习1-(C语言基础、VS快捷键)
C语言基础复习 1.三码 正数: 3码合1 ,正数的反码/补码就是其本身 负数: 原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值 原码:11010101 负数的反码是在其原码的基础上 ...
- python3数据结构与算法
python内置的数据结构包括:列表(list).集合(set).字典(dictionary),一般情况下我们可以直接使用这些数据结构,但通常我们还需要考虑比如搜索.排序.排列以及赛选等一些常见的问题 ...
- keras例子-matchnet
2015CVPR:MatchNet_ Unifying Feature and Metric Learning for Patch-Based Matching 主要是基于patch的图像特征匹配,基 ...
- nagios监控客户端报错/usr/bin/perl^M: bad interpreter: No such file or directory
nagios服务端监控客户端内存时发现监控不上 在客户端直接执行脚本,报错如下: # /usr/local/nagios/libexec/check_memory.pl -w 6% -c 3% -ba ...
- mongodb数据库安装及常见操作
客户端和服务端的安装 # rpm -ivh mongo-10gen-2.4.6-mongodb_1.x86_64.rpm mongo-10gen-server-2.4.6-mongodb_1.x86_ ...
- FreeSWITCH与PSTN对接
FreeSWITCH与PSTN电话系统对接设定 一.环境介绍 我们目前使用模拟的话机连接到电信运营商,购买他们配套的电话总机,勉强实现了公司的基本通话.但是客户电话总机系统以及升级添加新的应用不但费用 ...