开发者社区> .云小站> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

用Emit技术替代反射

简介: System.Reflection.Emit命名空间类可用于动态发出Microsoft中间语言(MSIL)代码,以便生成的代码可以直接执行。反射也用于获取有关类及其成员的信息。换句话说,反射是一种技术,允许您检查描述类型及其成员的元数据,你可能以编程方式访问过组件对象模型类型库, .NET中的反射非常相似,但功能强大且易于使用。
+关注继续查看
System.Reflection.Emit命名空间类可用于动态发出Microsoft中间语言(MSIL)代码,以便生成的代码可以直接执行。反射也用于获取有关类及其成员的信息。换句话说,反射是一种技术,允许您检查描述类型及其成员的元数据,你可能以编程方式访问过组件对象模型类型库, .NET中的反射非常相似,但功能强大且易于使用。使用.NET编译器编译源文件时,编译器会产生源文件中语句中的MSIL代码以及描述文件中定义的类型的元数据。正是这个元数据,.NET中的反射API使你能够检查。在这个System.Reflection命名空间中,有一些类可用于帮助访问程序中固有的结构,比如类、类型、字段、结构、枚举、成员和方法。例如,您使用Type类来标识所反映的类的类型,FieldInfo类表示结构或枚举的字段。MemberInfo类表示反射类的成员,并使用MethodInfo类表示反射类的方法。PrimeRealFipe类表示反射类中的方法的参数。

使用System.Reflection.Emit命名空间类在可以编译时创建代码,但前提是必须懂IL代码。(本文不做IL代码详解,因为我也不会。。。)事实上,你实际编写的是就是幕后的MSIL本身。你可以使用反射在内存中定义程序集,为该程序集创建类/模块,然后为该模块创建其他模块成员和新类型。你同样也可以使用Emit来构造程序集。Reflection.Emit是一个强大的命名空间,我们可以在运行时动态地发出瞬态和持久化程序集。Reflection.Emit产生一个低级,语言中立的MSIL。通常,我们通过将源代码保存到磁盘然后编译该源代码来创建程序集,然后我们调用我们需要从该程序集中使用的类的方法,该程序集是在磁盘上编译的。但是你可以想象,这涉及额外的磁盘写入和读取工作!使用反射生成代码,我们可以省略此开销并立即将操作代码直接发送到内存中。反射发射只不过是直接在代码中编写任何汇编代码,然后即时调用生成的代码。这也并不是说反射效率就是高,因为在运行期产生指令也是需要时间,各有优缺点。

System.Reflection.Emit命名空间提供用户动态创建.exe文件所需的类。它的类允许编译器或工具发出元数据和MSIL。因此,您可以动态地在磁盘上创建.exe文件,就像运行代码,保存代码并调用编译器来编译代码一样。大多数情况下,您需要此功能和此命名空间用于自定义脚本引擎和编译器。
Reflection.Emit命名空间有许多可用于重要的的类。以下是两个最重要的:

    AssemblyBuilder类是在运行时发出代码并具有创建动态模块的方法的任何应用程序的起点。
    ModuleBuilder类用作在运行时向动态程序集添加类和结构等类型的起点。

生成MSIL指令的ILGenerator.OpCodes类包括其所需字段中的所有IL指令。MSIL是CLR或中间语言的基本汇编语言的无类型操作代码。当您编写任何C#代码并对其进行编译时,它将首先转换为MSIL。然后,当您在MSIL中调用程序集时,它将以相应的机器语言进行转换和执行。学习MSIL的最简单方法是反汇编您编译的简单代码。您可以使用.NET SDK实用程序之一ILDasm.exe(IL反汇编程序)在Vs插件库下载即可,来反汇编任何已编译的.NET代码。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
mybatis学习(16):不使用接口的方式
mybatis学习(16):不使用接口的方式
9 0
NFT元宇宙农场链游系统开发技术详情丨NFT元宇宙农场链游开发源码案例
 区块链是一种块链式数据结构,以时间先后为基准,将存储数据的区块以顺序相连的形式相结合,同时以密码学方式确保数据的不可篡改和不可伪造,是一种安全性极高的分布式账本。广义来讲,区块链利用块链式数据结构来对数据进行验证与存储、利用分布式节点共识算法对数据进行更新、利用密码学方式确保数据的传输与访问安全、利用自动化脚本编写的智能合约来对数据进行编程和操作,是一种全新的分布式架构基础与计算方式。
20 0
Qt中base64基础的应用
Qt中base64基础的应用
21 0
Git----Git命令基础应用
Git----Git命令基础应用
13 0
阿里加码搜索战,前锋叫“夸克”
搜索之战再起,百度没有号码牌。
942 0
Git仓库操作命令
创建仓库 git init 在当前目录执行,会生成.git目录文件,这个和SVN一致。 提交到仓库 git commit -m "first commit" -m:表示提交描述,必须要填。
882 0
[MyBatis日记](6)一对一与一对多映射
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/50670732 1. 一对一映射 1.1 第一种方式 每一个学生都有一个与之关联的地址信息。
908 0
一起谈.NET技术,.NET缓存机制探讨与比对
  相信大多数开发人员都比较了解缓存了,很多开发人员都在软件开发中使用了预定义或自定义的缓存,并从中获得了预期的应用程序的性能提升.这篇和后续文章将详细的介绍与探讨.net体系下的缓存实现的机制,并讨论它的优点与缺点. .NET缓存机制:使用缓存的实际价值   在kevinhoffman,lonnykruger的书中写到:开发人员经常需要将数据(临时数据)临时存放到一个存储媒体以便快速访问.这种临时数据的存储器叫做缓存.如果开发人员合理使用缓存,则可以大幅度提高应用程序的性能. 上面是一段完美的关于缓存的定义,就目前而言,迅速而便捷的将数据提供给核心处理代码已成为一个重要的设计要求。
926 0
+关注
9
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载