用Emit技术替代反射

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代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows安装TortoiseGit详细使用教程

windows安装TortoiseGit详细使用教程【基础篇】_小飞牛的技术博客_51CTO博客windows安装TortoiseGit详细使用教程【基础篇】,环境:win8.164bit安装准备:首先你得安装windows下的git msysgit1.9.5安装版本控制器客户端tortoisegit tortoisegit…

keras中文文档_【DL项目实战02】图像识别分类——Keras框架+卷积神经网络CNN(使用VGGNet)

版权声明:小博主水平有限,希望大家多多指导。目录:【使用传统DNN】BG大龍:【DL项目实战02】图像分类——Keras框架使用传统神经网络DNN​zhuanlan.zhihu.com【使用卷积神经网络CNN】BG大龍:【DL项目实战02】图像识别分…

Java Html转pdf实战

Java Html转pdf实战 - 简书年尾手头没啥事,干起了打杂工作,最近帮忙解决后端项目里一个html批量转pdf速度慢的问题,项目里用到的转换工具是 wkhtmltopdf ,这货转单个html还好,批量转速...https://www.jianshu.com/p/d0…

Hadoop生态圈-Ambari控制台功能简介

Hadoop生态圈-Ambari控制台功能简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 在经历一系列安装过程之后(部署过HDP后我终于发现为什么大家喜欢用它了,部署比CDH简单是他优势之一&…

oracle监听启动很慢

TNS-12531: TNS:cannot allocate memory 首先查看内存,free -m 发现当前的空闲内存还有很多,那就不是内存不足的问题 想到之前重启过数据库服务器,查看主机名hostname,然后在查看etc/hosts 中的主机名,发现两者不一致,…

python地图标注_Python 给定的经纬度标注在地图上的实现方法

博主最近发现了python中一个好玩的包叫basemap,使用这个包可以绘制地图。值得说一下的是,basemap还没有pip检索,因此不能直接使用pip install basemap,来安装这个包。所以需要自己把下面两个包自行下载,然后在该目录下使用pip安装…

剪映专业版PC端清理缓存与日志

清理缓存 这个简单,在全局设置里,点击删除键,就可以 清理日志 软件每次剪辑都会生成日志,日志路径在 C:\Users\zengm\AppData\Local\JianyingPro\User Data\Log C:\Users\zengm\AppData\Local\JianyingPro\User Data\VELog

nodejs源码_nodejs之setTimeout源码解析

setTimeout是在系统启动的时候挂载的全局函数。代码在timer.js。function setupGlobalTimeouts() {const timers NativeModule.require(timers);global.clearImmediate timers.clearImmediate;global.clearInterval timers.clearInterval;global.clearTimeout timers.clear…

百度网盘PC端缓存文件夹

在C:\Users\zengm\AppData\Roaming\baidu\BaiduNetdisk\users\下面 BaiduYunCacheFileV0.db 文件为百度网盘目录数据,结构为: 百度网盘BaiduYunCacheFileV0.db数据库研究_wqq1027的博客-CSDN博客_百度网盘数据库最近研究了一下百度网盘的本地数据库文件…

python 图片转文字错误_python3把base64字符串写成图片文件出错

下面的代码在python2下正常的,是一个微信图标,文件md5是a1be719025844a1918ec6a338eaa8456我对python3不熟悉,不知道要怎么改#!/usr/bin/python3import base64def filePutContents(file, content):fp open(file, a)fp.write(content)fp.clos…

从业回忆录,最后悔的事

被一篇文章误导 我清楚地记得,在我毕业第一年,我看到了一篇关于程序员怎么学技术的文章,观点是程序员要多学技术,文章引用了典故:“高筑墙,广积粮,缓称王”。当时读这篇文章,感觉很有道理,认同了文章里的观点。 这么些年,学了不少技术:C#、Asp.net、Java Web套餐、A…

kodexplorer开源网盘php程序配置解析

config/setting_user.php 追加内容(一下都是,注意不要使用中文引号、双引号及分号) //【指定多语言只保留中文】 $GLOBALS[config][settings][language] zh-CN; //【自定义群组创建时自动新建的目录】 $GLOBALS[config][settingSystemDefaul…

实现三元组表示的两个稀疏矩阵的加法_K-BERT | 基于知识图谱的语言表示模型

1.研究背景BERT曾被应用在多项NLP任务中,并且取得了很好的结果。它通过在大规模开放语料库上进行预训练以获得通用的语言表示,然后在特定的下游任务中进行微调,吸收特定领域的知识。但这些模型在不同的领域执行知识驱动任务时,效果…

Excel单元格“删除线”的添加与删除

软件:windows,WPS 点击字体设计的小角标,进入更多设置,勾选“删除线”

excel 表格复制到word后,宽超出word如何调整?

网上很多方法是用“选择性粘贴----excel表格对象”,这个适用表格行数少的,不超过一页word的。 步骤 复制到word里后,选中表格,右键---自动调整--选择具体的调整方式。 调整后效果

sql 查询上个月的数据_数据分析-SQL 进阶篇 多表查询

知识点一、表的加法Union:删除表中的重复值union al:包含表中所有内容,包括重复值二、表的联结联结:join联结分为以下五种:交叉联结(cross join)又称为笛卡尔积:将表中的每一行与另外…

jenkins部署三种构建方式的详细步骤

部署背景:jenkins: CentOS 7.4C IP:172.16.3.74gitlab-11.5.3: CentOS 7.4D IP:172.16.4.74此上部署都是根据我之前的博客配置完成的;jenkins有三种构建方…

从业回忆,一次大胆的冒险,程序员转岗项目经理

有些事不必知道得太早 程序员这个行业,被“中年危机”言论导向后,就和洗脚城女技师差不多,年轻,漂亮,技术好,体力好的技师收入高,一边拿着高薪,赚着外快,一边吐槽是青春饭,经常熬夜,干不长久。 2010年之前,网上宣传程序员是青春饭,程序员中年危机的文章很少。近几…

python中控脚本_Python3.7实现中控考勤机自动连接

由于考勤机与oa对接,oa会在每天定时取考勤机数据,但是需要考勤机是连接状态,所以搜索了下相关教程,写了个脚本自动连接。完全是个python小白,代码烂,仅作为笔记。理论上支持所有程序的每天自动开启与关闭# …