CLR Via C# 3rd 阅读摘要 -- Chapter 1 - The CLR's Execution Model
Compiling Source Code Into Managed Modules
1.托管模块的组成:
- PE32 / PE32+ Header
- CLR Header
- Metadata
- IL Code
2.元数据的用途:
- 编译时不再需要头文件和类型库;
- 为IDE提供智能感知(IntelliSense)特性;
- 让CLR验证并执行哪些是“类型安全”(type-safe)的操作;
- 序列化-反序列化;
- 让GC跟踪对象的生存期 。
3.MS C++编译器构建EXE/DLL时默认在运行时允许非托管(unmanaged)代码, /CLR开关-->托管代码 。C++唯一可以在一个模块中包含托管和非托管代码。
Combining Managed Modules Into Assemblies
Loading The Common Language Runtime
1.MSCorEE.DLL,CLR的加载过程 ;
2. CLRVer.exe,查看本机可用的CLR版本,以及某个进程使用的CLR版本;
3./platform开关的效果
Executing Your Assembly's Code
1. ILASM.exe,ILDASM.exe;
2. CLR's JIT;如果同时运行应用程序的多个实例(在不同的进程中),JIT Compiler必须再次编译IL到本地CPU指令;
3. /optimize,/debug开关 ,没有优化的IL代码包含NOP指令,因此可以在调试时“编辑-运行”(edit-and-continue);
4.为什么托管代码比非托管代码还要快?
- JIT Compiler 可以将IL编译成本地指令时充分采用CPU的高级指令,而非托管代码在编译时通常采用符合CPU最低门槛的指令;
- JIT Compiler 可以略过那些判断条件永为False的分支;
- 二次编译,重新组织并去掉错误的条件分支(将来支持)。
5.IL与验证
- IL是基于栈的,在编译IL到本地指令的过程中,CLR会有一个验证(Verification)的过程。验证什么?代码是否安全。
6.不安全代码
- /unsafe开关;
- PEVerify.exe;
- 混淆与防盗版措施。
The Native Code Generator Tool: NGen.exe
1. NGen.exe的两个应用场景
- 改进应用程序的启动时间;
- 消减应用程序的工作集。
2. NGen之后需要注意的方面
- 并不能保护智力资产;
- 并不是一劳永逸,很容易失效。必须匹配的项(CLR,CPU,OS,MVID,依赖库的VID,安全);
- 低效的执行效率,降低≈5%。
The Framework Class Library
1.可干的事情
- Web服务
- Web站点(Webform)
- GUI程序(WinForm,WPF)
- RIAs (SilverLight)
- 控制台程序
- Windows服务
- 数据库存储过程
- 组件库
The Common Type System
1.CTS,CLI(ECMA-335),C#(ECMA-334)
2.CTS基本成员
- Field
- Method
- Property
- Event
3.成员访问修饰符
- Private (private)
- Family (protected)
- Family and Assembly (C#、VB.NET不支持)
- Assembly (internal)
- Family or Assembly (protected internal)
- Public (public)
4.System.Object有什么
- 比较两个对象实例是否相等
- 获得对象实例的散列值
- 查询对象实例的真实类型
- 对象实例的bitwise语义的拷贝行为
- 对象实例当前的表述信息
The Common Language Specification
1. CLS-compliant [assembly: CLSCompliant(true)]
Interoperability With Unmanaged Code
1. CLR支持的3种互操作场景
- 托管代码可以调用DLL中的非托管代码(P/Invoke)
- 托管代码可以使用现有的COM组件(Server),TlbImp.exe
- 非托管代码可以使用托管类型(Server),TlbExp.exe,RegAsm.exe
http://CLRInterop.CodePlex.com/
本章小结
1. 讲述了如何将各种语言的代码编译成托管模块,然后组装成程序集,CLR如何加载并执行这些程序集中的代码;
2. 介绍了NGen的用途和局限性,分析了为什么托管代码有可能比本地代码执行起来效率的可能原因;
3. 解释了CTS/CLR、编程语言(C#、VB、……)、CLS之间的关系;
4. 给出了托管代码与非托管代码三种互操作场景。