using System;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit; namespace TestEmit{ public interface IPerson{
void SayHello(); } class Person2 {
public void SayHello() { Console.WriteLine("i am person2");
}
} class Test2
{
static void Main(string[] args)
{
IPerson p = (IPerson)CreateType();
p.SayHello(); Console.ReadLine();
} public static object CreateType()
{
AssemblyName assemblyName = new AssemblyName("assemblyName");
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll");
TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public);
//*添加所实现的接口
typeBuilder.AddInterfaceImplementation(typeof(IPerson)); //实现方法
MethodBuilder mbIM = typeBuilder.DefineMethod("SayHello",
MethodAttributes.Public | MethodAttributes.HideBySig |
MethodAttributes.NewSlot | MethodAttributes.Virtual |
MethodAttributes.Final,
null,
Type.EmptyTypes); ILGenerator il = mbIM.GetILGenerator();
il.Emit(OpCodes.Ldstr, "The SayHello implementation of IPerson");
il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine",
new Type[] { typeof(string) }));
il.Emit(OpCodes.Ret);
typeBuilder.DefineMethodOverride(mbIM, typeof(IPerson).GetMethod("SayHello"));
//添加方法
//MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public, null, null); //ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator();
//ilOfSayHello.Emit(OpCodes.Ldstr, "蝈蝈");
//ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
//ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine"));
////没有返回值所有加OpCodes.Pop
//ilOfSayHello.Emit(OpCodes.Pop);
//ilOfSayHello.Emit(OpCodes.Ret);
Type personType = typeBuilder.CreateType();
assemblyBuilder.Save("Person.dll");
object obj = Activator.CreateInstance(personType);
MethodInfo methodInfo = personType.GetMethod("SayHello"); methodInfo.Invoke(obj, null);
return Activator.CreateInstance(personType);
} } }

c# emit 动态实现接口的更多相关文章

  1. C# Emit动态代理生成一个实体对象

    /// <summary> /// 使用Emit动态代理收集实体信息 /// </summary> /// <typeparam name="T"&g ...

  2. 秒懂C#通过Emit动态生成代码 C#使用Emit构造拦截器动态代理类

    秒懂C#通过Emit动态生成代码   首先需要声明一个程序集名称, 1 // specify a new assembly name 2 var assemblyName = new Assembly ...

  3. Java EE开发平台随手记5——Mybatis动态代理接口方式的原生用法

    为了说明后续的Mybatis扩展,插播一篇广告,先来简要说明一下Mybatis的一种原生用法,不过先声明:下面说的只是Mybatis的其中一种用法,如需要更深入了解Mybatis,请参考官方文档,或者 ...

  4. Emit动态生成代码

    Emit动态生成代码 引用:秒懂C#通过Emit动态生成代码 首先需要声明一个程序集名称, // specify a new assembly name var assemblyName = new ...

  5. React和动态网站接口的经济学

    来自: React and the economics of dynamic web interfaces 自从2000开始我就一直在做web开发,曾见过很多以各种库和框架的起起落落,这些库和框架作为 ...

  6. Emit动态代理.NetCore迁移之旅

    [前言] 前面我们介绍了Aop 从静态代理到动态代理:https://www.cnblogs.com/7tiny/p/9657451.html 我们在.NetFramework平台下使用微软提供的Em ...

  7. Emit动态生成代理类用于监控对象的字段修改

    利用Emit动态生成代理对象监控对象哪些字段被修改,被修改为什么值 被Register的对象要监控的值必须是Virtual虚类型 必须使用CreateInstance创建对象 必须使用DynamicP ...

  8. .Net Core JWT 动态设置接口与权限

    通过上一篇.Net Core官方的 JWT 授权验证学习到了JWT的授权.可以发现一个问题,就是如果每个接口可以使用的角色都是写死的,这样如果有所修改会非常麻烦,虽然用policy可以一定程度上缓解, ...

  9. C#动态创建接口的实现实例对象

    本文简单介绍如何动态创建接口interface的实现实例对象,包含两个知识点: 1.如何获取接口interface的所有实现实例对象? 2.如何判断实例对象的构造函数是否有参数? 准备工作 首先新建一 ...

随机推荐

  1. IOS-内存检测以及优化

    IOS-内存检测以及优化 2014年01月23日 Jason PS:开始写这个系列的笔记:主要是对过去自己比较模糊的一些概念进行测试,明确结果,提高自己 IOS 应用如果占用系统的内容过大(8GB), ...

  2. [论文]Coordination of Cluster Ensembles via Exact Methods

    作者:Ioannis T. Christou, Member, IEEE IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE, ...

  3. svn没有"对号"等符号

    [问题描述]调整svn建立好了服务端.安装客户端也检出成功了.但是就是没有对号符号. [解决方案]右键菜单,设置,里面有“图标覆盖”这个选项,把你的文件夹加入进去,然后注销windows用户重新登陆

  4. TeamViewer下载地址

    http://www.teamviewer.com/zhCN/download/linux.aspx Ubuntu配置远程访问的xrdp协议和teamviewer软件 先启用远程设置:System-& ...

  5. CAS统一认证系统学习

    Yale CAS(耶鲁集中认证服务)简介 http://www.5iops.com/html/2012/sso_0713/181.html 单点登陆框架CAS的研究 http://www.cnblog ...

  6. 【原创】SSAS 实例重命名

    在某些时候我们可能想对现有的SSAS实例进行重命名之类的,比如:我以前有两个SSAS,一个2005,一个2008R2,其中我们2005是一开始安装的,并且是默认实例,2008R2是命名实例,但是随着使 ...

  7. 洛谷 P1426 小鱼会有危险吗【模拟/题意理解】

    题目描述 有一次,小鱼要从A处沿直线往右边游,小鱼第一秒可以游7米,从第二秒开始每秒游的距离只有前一秒的98%.有个极其邪恶的猎人在距离A处右边s米的地方,安装了一个隐蔽的探测器,探测器左右x米之内是 ...

  8. 深入理解 JavaScript Function

    1.Function Arguments JavaScript 函数的参数 类型可以是 复杂类型如  Object or Array 和简单类型 String Integer null undefin ...

  9. Beginning Auto Layout Tutorial in iOS 7: Part 2

    Auto Layout to the rescue! 接下来就看看如何使用Auto Layout来实现这个效果. 首先移除viewWillLayoutSubviews方法,选择Main.storybo ...

  10. OFV.msi是什么 为什么更新时无法安装

    在网络上搜索了下 这个是Microsoft Office 文件验证加载项,微软提供了一个单独的文件:http://www.microsoft.com/downloads/zh-cn/confirmat ...