当前位置: 首页 > news >正文

[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开发工具;第二,构建需要在运行时通过元数据来生成远程类型的代理的程序;第三,希望加载静态程序集并能够动态地插入新的类型到二进制镜像中。

 

相关文章:

  • ActiveMQ入门实例
  • Centos5配置Python mod_wsgi Django安装osqa
  • 在U盘上安装ESXi 4.1.0
  • DRBD介绍
  • linux yum设置
  • 面向对象的三个基本特征是:封装、继承、多态
  • Linux软RAID
  • SQL基础知识复习
  • dhcp服务器应用
  • Struts2 interceptor 和 filter
  • 用chardet判断字符编码的方法
  • 再生龙使用
  • ios开发使用UIWebView显示多种文档
  • 来个狠的
  • Nagios之图形化Pnp 安装和配置(转)
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • co模块的前端实现
  • crontab执行失败的多种原因
  • exif信息对照
  • Git同步原始仓库到Fork仓库中
  • Linux Process Manage
  • Mysql5.6主从复制
  • php ci框架整合银盛支付
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 好的网址,关于.net 4.0 ,vs 2010
  • 来,膜拜下android roadmap,强大的执行力
  • 聊聊flink的TableFactory
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端临床手札——文件上传
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 用简单代码看卷积组块发展
  • 2017年360最后一道编程题
  • MPAndroidChart 教程:Y轴 YAxis
  • 国内开源镜像站点
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #微信小程序:微信小程序常见的配置传值
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (JS基础)String 类型
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (黑马C++)L06 重载与继承
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (十六)串口UART
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (循环依赖问题)学习spring的第九天
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • ./configure,make,make install的作用(转)
  • .NET Core 成都线下面基会拉开序幕
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .Net 代码性能 - (1)
  • .Net多线程总结
  • .NET正则基础之——正则委托