读书笔记—CLR via C#章节1-2
这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深自己理解的深度,当然同时也和技术社区的朋友们共享。
程序集
- 描述:一个或多个类型定义文件及资源文件的集合
- 特征:可重用、可保护、可版本控制的单元
- 生成:可通过C#编译器(或其他编译器)或AL.exe生成
- 组成:
- 托管模块(module)
- PE头,PE32或PE32+,面向CPU架构的信息
- CLR头,面向CLR的信息,版本、入口、元数据等
- 元数据,源代码类型成员定义和引用的类型成员定义
- IL代码,编译器生成的托管代码,面向对象的机器语言
- 资源文件
- 程序集清单
CPU架构
针对x86、x64和IA64三种平台有三个版本的CLR,信息包含在PE头中
- 跨CPU架构:使用anycpu,兼容所有CPU架构平台
- 指定CPU架构:与非托管交互时,考虑到非托管接口的平台特定性,才使用特定CPU架构
| /开关 | 托管模块 | x86 windows | x64 windows | IA64 windows |
| anycpu | PE32/不指定 | 32位 | 64位 | 64位 |
| x86 | PE32/x86 | 32位 | Wow64运行 | Wow64运行 |
| x64 | PE32+/x64 | 不运行 | 64位 | 不运行 |
| Itanium | PE32+/Itanium | 不运行 | 不运行 | 64位 |
元数据
- 编译时支持,已包含和引用的类型/成员有关的全部信息
- 智能感知(Intelligence),成员(方法、属性、事件和字段)及方法参数
- 验证类型安全
- 反射和序列化(对象激活与对象重建)
- 垃圾回收,垃圾收集器能判断对象类型以及对象字段的引用信息
执行流程
- 判断是否存在已编译的本地代码,如果存在直接执行(3),否则开启JIT编译器
- 启动JIT编译(MSCorEE.dll)
- 在元数据中查找调用信息(方法等)
- 获取该调用信息的IL
- 分配内存块DynamicMemory
- 编译IL为本地CPU指令,并存储到DynamicMemory
- 修改Type表调用指针指向DynamicMemory
- 跳转到DynamicMemory中的本地代码
- 执行本地代码(CPU指令)

编译过程
有两个C#编译器开关会影响代码的优化:/optimize和/debug,请看下表:
| 编译器开关设置 | C# IL代码质量 | JIT本地代码质量 |
| /optimize- /debug(默认) | 未优化 | 有优化 |
| /optimize- /debug(+/full/pdbonly | 未优化 | 未优化 |
| /optimize+/debug(-/+/full/pdbonly | 有优化 | 有优化 |
优缺点比较:
- 未优化(/optimize-),未优化IL代码,包含许多NOP(no-operation)指令,还包含分支指令,优点是即使调试
- 优化的IL代码,编译器删除多余的NOP和分支指令,代码更小,但却难以单步调试
编译器默认调试配置
- Debug: /optimize- /debug:full
- Release: /optimize+ /debug:pdbonly
性能神器 – JIT
- 将IL编译为本地代码时,对环境的理解比其他编译器更加深刻
- 生成面向特定CPU的指令,有效利用不同平台的资源提高效率
- 优化代码,使IL更加轻量,并且更容易理解
鸡肋?NGen.exe
优点:
- 预编译保存在磁盘上,加快启动速度
- 减小工作集,进程之间共享代码(通过内存映射)
缺点:
- 对代码无优化
- 较差的执行时性能(无特定CPU指令优化,运行时字段无法直接访问)
部署
| 私有部署 | 全局部署 | |
| 弱命名程序集 | 支持 | 不支持 |
| 强命名程序集 | 支持 | 支持 |
私有程序集部署特征:引用程序集存放在基目录或者基目录的子目录
探测范围:基路径 - 配置路径 - 相同名称子路径 - 语言文化子目录
私有程序集目录配置:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="AuxFiles1,AuxFiles2" />
</assemblyBinding>
</runtime>
</configuration>
其他(Other Tips)
SDK工具
- IL编译及反编译 – ILAsm.exe/ILDasm.exe
- CLRVer.exe 查看CLR版本
- DumpBin.exe和CorFlags.exe,查看托管模块所嵌入的信息
- 安全检查工具:PEVerify.exe
IL是中间语言,支持混合编程,C#只是利用CLR的一个子集,IL则是完全面向CLR的
CLR启动入口(MSCorEE.dll)(3种CPU架构3个版本,负责加载程序集)
WoW64能模拟x86指令集
CLS语言规范,规范混合语言之间的互操作 [assembly: CLSCompliant(true)]
语言互操作
- 托管代码调用dll中的非托管函数(PInvoke平台调用)
- 托管代码使用现有的COM组件
- 非托管代码使用托管类型
- 开源实现:http://CLRInterop.CodePlex.com
响应文件,rsp文件,包含一些编译开关参数,系统全局响应文件自动引用默认程序集
程序集搜索目录及顺序
- 工作目录
- CSC.exe本身目录
- /lib 指定的目录
- LIB环境变量指定的目录
多文件程序集,编译器将module合并,addmodule开关,也可以使用AL.exe,用处:
- 单独文件存储类型,允许增量更新,分批打包/部署
- 嵌入资源
- 不同的语言进行实现,然后再合并
程序集文化
- 语言文化包括特定文化或者文化中性
- 附属程序集,使用System.Resources.ResourceManager访问附属程序集的资源
- 设置方式 1:AL.exe /culture 2:[assembly:AssemblyCulture(“de-CH”)]
读书笔记—CLR via C#章节1-2的更多相关文章
- 读书笔记—CLR via C#章节3
这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深 ...
- 读书笔记—CLR via C#章节11-13
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 读书笔记—CLR via C#章节8-10
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 读书笔记—CLR via C#章节4-7
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 读书笔记—CLR via C#线程27章节
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 读书笔记—CLR via C#同步构造28-29章节
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 读书笔记—CLR via C#线程25-26章节
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 读书笔记—CLR via C#异常和状态管理
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
- 读书笔记—CLR via C#反射
前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...
随机推荐
- 走进spring之springmvc
走进spring之springmvc 在动手之前,我们需要了解下springnvc.这里先献上一张springmvc的流程图及讲解. Spring的MVC框架是一个基于DispatcherServle ...
- Scrum总结
Scrum总结一个轻量级的软件开发方法 Scrum是一个敏捷开发框架,是一个增量迭代的开发过程..在这个框架整个开发周期由若干个小的跌代周期,每个小的的跌代周期称为一个Sprint,每个Sprint的 ...
- (大数据工程师学习路径)第一步 Linux 基础入门----命令执行顺序控制与管道
介绍 顺序执行.选择执行.管道.cut 命令.grep 命令.wc 命令.sort 命令等,高效率使用 Linux 的技巧. 一.命令执行顺序的控制 1.顺序执行多条命令 通常情况下,我们每次只能在终 ...
- java缓存技术(转)
最近在做java缓存,了解了一下.以下仅是对map对方式讨论.没有对点阵图阵讨论.作缓存要做以下2点: 1:清理及更新缓存时机的处理: . 虚拟机内存不足,清理缓存 .. 缓存时间超时,或访问 ...
- MIFARE系列7《安全》
飞利浦的MIFARE卡因为它的高安全性在市场上得到广泛应用,比方我们乘车用的公交卡,学校和企业食堂的饭卡等等.它每一个扇区有独立的密匙(6个字节的password),在通信过程中首先要验证密匙才干读写 ...
- Java一些八卦集合类
Map 和 Set关系 Map和Set事实基础的朋友,有着千丝万缕的联系. Map它可以被看作是Set延期.从何时起Set内容存储在key-value的值当表单.这个Set实际上可以作为Map使用.反 ...
- 划分数 (DP)
输入: n=4 m=3 M=10000 输出: 4 (1+1+2=1+3=2+2=4) 复杂度(nm) int n,m; int a[MAX]; int dp[MAX][MAX]; //数组 void ...
- I2C驱动程序框架probe道路
基于Linux的I2C驱动器.采纳probe道路.根据这个框架,如下面就可以写任何支持I2C总线设备Linux驱动器. I2C设备连接到cpu具体i2c接口.被安装在cpu的i2c适配器.i2c设备和 ...
- python_random随机
在数据清洗,评估 ,抽验等等过程中,经常有这样的应用场景 : 需要在一个大的数据集合中随机出来样本,进行人工评估.为了保证足够随机,借助脚本来实现. 下面一个脚本 ,用于应对这种应用场景. 使用方法 ...
- 从头开始学JavaScript (十三)——Date类型
说明:UTC:国际协调日期 GMT:格林尼治标准时间 一.date类型的创建 使用new操作符和Date()构造函数 var now=new Date(): 传入参数:Date.parse()和Dat ...