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的使用相关推荐

  1. Java中反射的三种常用方式

    Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...

  2. 在C++中反射调用.NET(二)

    反射调用返回复杂对象的.NET方法 定义数据接口 上一篇在C++中反射调用.NET(一)中,我们简单的介绍了如何使用C++/CLI并且初步使用了反射调用.NET程序集的简单方法,今天我们看看如何在C+ ...

  3. 请说明一下JAVA中反射的实现过程和作用分别是什么?

    请说明一下JAVA中反射的实现过程和作用分别是什么? Java语言编译后形成.class文件,反射就是通过字节码文件找到一个类,类中的方法及属性等.反射的实现主要通过四个类 Class 类的对象 Co ...

  4. Java中反射的实现方式

    Java中的发射机制 所谓反射,是指在运行时状态中,获取类中的属性和方法,以及调用其中的方法的一种机制.这种机制的作用在于获取运行时才知道的类(Class)及其中的属性(Field).方法(Metho ...

  5. c#中反射技术在Unity中的运用

    反射技术给类赋值的好处就是可以简化代码,封装的好处就显而易见了.最直接的用途就是用在在显示配置文件的时候,个人习惯性做法是做一个VO来存储需要的数据,其代码如下: internal class Bas ...

  6. Python面向对象中反射和双下的正确用法

    一.反射 反射:程序可以访问,检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性 python中的一切事物都是对象(都可以使用反射) 四个可 ...

  7. JAVA中反射的实现过程和作用分别是什么?

    JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类.类中的方法以及属性等.反射的实现主要借助以下四个类:Class:类的对象,Constructor:类的构造方法,Fi ...

  8. 反射如何拿到私有属性_JAVA中反射机制的价值

    一.反射机制概述 Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法.这种在运行时动态的获取信息以及动态调用对象的方法 ...

  9. 依赖注入底层反射原理_Spring中反射与反射的原理(转载)

    Spring 中的反射与反射的原理 | Depp Wang's Blog 在造轮子:实现一个简易的 Spring IoC 容器一文中提到 Spring 在创建 Bean 实例和依赖注入时使用了反射,本 ...

  10. 浅谈Junit测试中反射和Jmock的应用

    最近由于项目的需要,开发后的代码强制编写Junit测试,并且达到一定的coverage probility(主要应付客户).所以,为了达到一定的覆盖率,鄙人不得不在Case中大量使用反射(一般是针对p ...

最新文章

  1. Py之smtplib:smtplib(aiosmtplib)的简介、安装、使用方法之详细攻略
  2. 欧姆字符的编码c语言,《编码:隐匿在计算机软硬件背后的语言》读书笔记
  3. i.MX31主要开发资源(转贴)
  4. 汇编指令入门级整理 | 原力计划
  5. 实例验证WEB浏览器智能应对节点失效
  6. Shell 根据名称杀掉进程
  7. 学生选课系统代码-3mode【DB】视图层代码【MVC--M】代码
  8. 什么情况下使用多线程
  9. cygwin终端中显示的中文改成英文(没成功)
  10. 轻松筹 html模板,水滴筹、轻松筹感人标题模板25个字怎么写?在朋友圈发求捐款语录怎么写?...
  11. NAS(Network Attached Storage)协议
  12. win10计算机切换用户,win10账户切换,详细教您win10怎么切换账户
  13. 【论文翻译】Semantic Relation Reasoning for Shot-Stable Few-Shot Object Detection
  14. 网页美学设计原则(上)
  15. 【抖音小程序】抖音小程序避免onClose重复回调 解决广告重复回调
  16. 全差分放大器(FDA)的基本知识
  17. RSA非对称加密传输---前端加密解密(VUE项目)
  18. SQL Server UPDATE语句用于更新数据
  19. 數據移動時發生***識別欄位其外顯值只有當使用了資料行清單且 IDENTITY_INSERT 為 ON 時才能指定...
  20. 射频单刀双掷开关常见结构

热门文章

  1. [转]How to Improve Entity Framework Add Performance?
  2. 自己设计的一个打字平台
  3. js中match的用法
  4. Centos 7 固定ip配置
  5. 解决复制项目后名称不改变的问题:org.eclipse.wst.common.component
  6. Spring MVC之基于xml配置的web应用构建
  7. 限定某个目录禁止解析php 限制user_agent php相关配置
  8. C# 本质论 第二章 数据类型
  9. spring securiy使用总结
  10. 数据层(DAL)自动生成库