博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# emit 动态实现接口
阅读量:5909 次
发布时间:2019-06-19

本文共 2628 字,大约阅读时间需要 8 分钟。

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);        }    } }

 

转载地址:http://mkvpx.baihongyu.com/

你可能感兴趣的文章
基本排序的实现与性能比较
查看>>
我的友情链接
查看>>
VC++编写远程控制软件
查看>>
CentOS搭建ionic、cordova、phonegap、android开发环境
查看>>
开源之我见(5)开源社区办学
查看>>
CentOS 挂载光盘
查看>>
php 奇葩问题 ob_clean() MARK一下(输出的JSON数据前面有个小红点)
查看>>
kernel panic - not syncing Machine Check
查看>>
RHEL 6.5忘记root密码处理方法
查看>>
Tomcat
查看>>
web.xml/servlet过滤器之压缩GzipFilter
查看>>
MySQL服务器/tmp目录被占满
查看>>
用xtrabackup实现mysql的主从复制快速部署【主不锁表】
查看>>
清明情
查看>>
分享Hadoop大数据年薪23W就业分享
查看>>
如何使用live writer客户端来发布CSDN的博客文章
查看>>
linux 服务器定时重启reboot
查看>>
LinuxCast 邮件服务器 视频教程笔记
查看>>
linux系统优化
查看>>
巨石应用转微服务
查看>>