[C#]C#学习笔记-CIL和动态程序集

C#学习笔记-CIL和动态程序集

罗朝辉(http://www.cnblogs.com/kesalin/

《C#与.NET高级程序设计》读书笔记

 

1,System.Reflection.Emit 命名空间提供了很多在运行时能够在内存中产生.NET程序集的类型,在内存中定义和执行程序集的正式术语是动态程序集(dynamic assembly)。我们使用专有的 CIL(公共中间语言)指令集来动态构建程序集。

2,CIL 本质上就是.NET平台的母语,当我们选择某种托管的编程语言(C#,VB,COBOL.NET等)构建.NET程序集时,同这个语言相关的编译器就会把源代码翻译成CIL。我们可以直接使用.NET Framework SDK提供的 CIL 和 CIL编译器(ilasm.exe)来开发和构建.NET程序集,虽然通常我们很少这么做。这么说把CIL对应.NET开发人员就好比汇编语言对于一个C++程序员一样。

3,CIL定义了一组通用的关键字,这些关键字可以分为三个类别:CIL指令,CIL特性和CIL操作码。
CIL指令用于描述.NET程序集总体结构,它用于通知CIL编译器如何定义在程序集用到的命名空间,类型和成员。CIL指令语法上使用一个(.)的前缀来表示,如:.namespace, .class, .publickeytoken, .method, .assembly等。
CIL特性可以限定应该如何处理一个 CIL 指令。例如:一个.class指令可以同public特性(明确类的可见性),extends特性(明确类的基类)和 implements特性(明确类支持的接口)相结合。
CIL操作码提供类的实现逻辑。如:ldstr(转载字符串),box,unbox,throw,sizeof等。

4,CIL是一个完全以栈为基础的开发语言,在CIL中用来负责这个栈实现的部分叫做虚拟执行栈。将操作码压入这个栈的过程叫做加载(Load),将操作码从栈顶移到内存中(如局部变量)的过程叫做存储(store)。 CIL不允许直接访问一个数据,包括局部变量,方法中传入的变量或者类型的字段数据。为了实现访问,必须显式地加载数据到栈中,并在使用时弹出。

5,正反向工程:可以使用ildasm.exe将程序集的CIL代码导出到外部文件,有了CIL代码也可以使用CIL编译器ilasm.exe重新编译。正反向工程让我们能够修改一个没有源代码的程序集,也可以补充可与COM互操作的程序集在在装换过程中丢失的IDL特性。

6,动态程序集在运行中通过使用 System.Reflection.Emit命名空间提供的类型在内存中创建,System.Reflection.Emit 命名空间使得在运行时创建程序集及其模块,类型定义以及CIL实现逻辑成为可能。一旦完成了这些,就可以将内存中的二进制程序保存到磁盘上生成一个新的静态程序集。尽管创建动态程序集不是很常见,但在如下一些场合这个技术还是非常有用:第一,构建需要根据用户的输入来生成程序集文件的.NET开发工具;第二,构建需要在运行时通过元数据来生成远程类型的代理的程序;第三,希望加载静态程序集并能够动态地插入新的类型到二进制镜像中。

 

posted @ 2012-02-20 18:01  飘飘白云  阅读(1237)  评论(0编辑  收藏  举报
本博客遵循 Creative Commons License “署名-非商业用途-保持一致”创作共用协议。 与我联系