C#中反射的使用(How to use reflect in CSharp)(3)Emit的使用
Emit意在动态构建一个可以执行(当然也就可以反射)或者只可以反射的动态库。
个人认为在不得不使用反射的情况下,使用Emit会使得效率提升空间很大。亦或者动态插件模式的软件设计中会用到。
依然2%的废话和98%的代码:
1 using System; 2 using System.Reflection; 3 using System.Reflection.Emit; 4 5 namespace ReflectionTest 6 { 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 //Emit 12 /* 13 Emit的知识隶属于反射的一部分,也是比较偏门的一部分。 14 在出现Dynamic和匿名类之后,它会有更小的用武之地,但仍然属于Reflection的知识范畴。 15 区别于“正常”的反射,Emit是动态的构建一个类, 16 比如,现在你没有Person.Dll,没有项目可以引用,没有可以反射的对象 17 那么你可能会想到Emit,它可以使你用代码构建出一个Person类,你甚至可以把动态构建的类保存成DLL,然后使用反射调用 18 虽然也是用C#去实现,但语法风格大不相同,强硬的理解,可以理解Emit暴漏给C#一些接口,让你去操作IL,然后生成动态库 19 在这次的blog中,我们的目的就是用代码构建出这个person类。OK,Let's start 20 */ 21 //STEP 1. Give him a name 22 var assemblyName = new AssemblyName("PersonMoudle"); 23 24 //STEP 2. Build a assembly 25 var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, 26 AssemblyBuilderAccess.RunAndSave); 27 28 //STEP 3. Add a moudle 29 var moudle = assemblyBuilder.DefineDynamicModule("PersonMoudle", "PersonMoudle.dll"); 30 31 //SETP 4. Add a Class 32 var typePart = moudle.DefineType("Person", TypeAttributes.Public); 33 34 //SETP 5. Add a method for this Class 35 var methodPart = typePart.DefineMethod("SayHi", MethodAttributes.Public, null, null); 36 37 //STEP 6. Imp the method 38 var il = methodPart.GetILGenerator(); 39 il.EmitWriteLine("Hi! I'm SayHi method!"); 40 il.Emit(OpCodes.Ret); 41 42 typePart.CreateType(); 43 assemblyBuilder.Save("PersonMoudle.dll"); 44 45 //再比如,构建一个exe 46 var ad = AppDomain.CurrentDomain; 47 var am = new AssemblyName {Name = "TestEmit"}; 48 var ab = ad.DefineDynamicAssembly(am, AssemblyBuilderAccess.Save); 49 var mb = ab.DefineDynamicModule("testmod", "输出一句话.exe"); 50 var tb = mb.DefineType("TestEmit.Test", TypeAttributes.Public); 51 var metb = tb.DefineMethod("ConsoleWord", MethodAttributes.Public | MethodAttributes.Static, typeof (void), 52 null); 53 ab.SetEntryPoint(metb); 54 ILGenerator il1 = metb.GetILGenerator(); 55 il1.EmitWriteLine("Hello World"); 56 il1.EmitWriteLine("按任意键退出……"); 57 il1.Emit(OpCodes.Call, typeof (Console).GetMethod("ReadKey",new Type[]{}));//指定无参数的重载。生产环境的代码中应该有更加严格判断,具体指定个某个方法请翻前篇的文章。 58 il1.Emit(OpCodes.Ret); 59 tb.CreateType(); 60 ab.Save("输出一句话.exe"); 61 Console.ReadKey(); 62 } 63 } 64 }
我们可以看到,执行完这个之后,在Debug里会生成我们想要的PersonMoudle.dll和输出一句话.exe、反编译后的dll和exe的执行效果:
转载于:https://www.cnblogs.com/xidu/p/4269578.html
C#中反射的使用(How to use reflect in CSharp)(3)Emit的使用相关推荐
- Java中反射的三种常用方式
Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...
- 在C++中反射调用.NET(二)
反射调用返回复杂对象的.NET方法 定义数据接口 上一篇在C++中反射调用.NET(一)中,我们简单的介绍了如何使用C++/CLI并且初步使用了反射调用.NET程序集的简单方法,今天我们看看如何在C+ ...
- 请说明一下JAVA中反射的实现过程和作用分别是什么?
请说明一下JAVA中反射的实现过程和作用分别是什么? Java语言编译后形成.class文件,反射就是通过字节码文件找到一个类,类中的方法及属性等.反射的实现主要通过四个类 Class 类的对象 Co ...
- Java中反射的实现方式
Java中的发射机制 所谓反射,是指在运行时状态中,获取类中的属性和方法,以及调用其中的方法的一种机制.这种机制的作用在于获取运行时才知道的类(Class)及其中的属性(Field).方法(Metho ...
- c#中反射技术在Unity中的运用
反射技术给类赋值的好处就是可以简化代码,封装的好处就显而易见了.最直接的用途就是用在在显示配置文件的时候,个人习惯性做法是做一个VO来存储需要的数据,其代码如下: internal class Bas ...
- Python面向对象中反射和双下的正确用法
一.反射 反射:程序可以访问,检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性 python中的一切事物都是对象(都可以使用反射) 四个可 ...
- JAVA中反射的实现过程和作用分别是什么?
JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类.类中的方法以及属性等.反射的实现主要借助以下四个类:Class:类的对象,Constructor:类的构造方法,Fi ...
- 反射如何拿到私有属性_JAVA中反射机制的价值
一.反射机制概述 Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法.这种在运行时动态的获取信息以及动态调用对象的方法 ...
- 依赖注入底层反射原理_Spring中反射与反射的原理(转载)
Spring 中的反射与反射的原理 | Depp Wang's Blog 在造轮子:实现一个简易的 Spring IoC 容器一文中提到 Spring 在创建 Bean 实例和依赖注入时使用了反射,本 ...
- 浅谈Junit测试中反射和Jmock的应用
最近由于项目的需要,开发后的代码强制编写Junit测试,并且达到一定的coverage probility(主要应付客户).所以,为了达到一定的覆盖率,鄙人不得不在Case中大量使用反射(一般是针对p ...
最新文章
- Py之smtplib:smtplib(aiosmtplib)的简介、安装、使用方法之详细攻略
- 欧姆字符的编码c语言,《编码:隐匿在计算机软硬件背后的语言》读书笔记
- i.MX31主要开发资源(转贴)
- 汇编指令入门级整理 | 原力计划
- 实例验证WEB浏览器智能应对节点失效
- Shell 根据名称杀掉进程
- 学生选课系统代码-3mode【DB】视图层代码【MVC--M】代码
- 什么情况下使用多线程
- cygwin终端中显示的中文改成英文(没成功)
- 轻松筹 html模板,水滴筹、轻松筹感人标题模板25个字怎么写?在朋友圈发求捐款语录怎么写?...
- NAS(Network Attached Storage)协议
- win10计算机切换用户,win10账户切换,详细教您win10怎么切换账户
- 【论文翻译】Semantic Relation Reasoning for Shot-Stable Few-Shot Object Detection
- 网页美学设计原则(上)
- 【抖音小程序】抖音小程序避免onClose重复回调 解决广告重复回调
- 全差分放大器(FDA)的基本知识
- RSA非对称加密传输---前端加密解密(VUE项目)
- SQL Server UPDATE语句用于更新数据
- 數據移動時發生***識別欄位其外顯值只有當使用了資料行清單且 IDENTITY_INSERT 為 ON 時才能指定...
- 射频单刀双掷开关常见结构
热门文章
- [转]How to Improve Entity Framework Add Performance?
- 自己设计的一个打字平台
- js中match的用法
- Centos 7 固定ip配置
- 解决复制项目后名称不改变的问题:org.eclipse.wst.common.component
- Spring MVC之基于xml配置的web应用构建
- 限定某个目录禁止解析php 限制user_agent php相关配置
- C# 本质论 第二章 数据类型
- spring securiy使用总结
- 数据层(DAL)自动生成库