zoukankan      html  css  js  c++  java
  • c# emit 动态实现接口

    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);
            }
    
        }
    
    
     
    }
  • 相关阅读:
    自己动手丰衣足食之轮播图一动态修改marginTop属性实现轮播图
    自己动手丰衣足食之 jQuery 数量加减插件
    Asp.net 中,在服务端向客户端写脚本的常用方法
    Asp.Net使用加密cookie代替session验证用户登录状态 源码分享
    Javascript技术之详尽解析event对象
    Javascript的V8引擎研究
    11个实用的CSS学习工具[转载收藏]
    为什么JavaScript声明变量的时候鼓励加var关键字
    asp.net菜鸟到中级程序员的飞跃 --30本好书点评
    创建安全的ashx文件,ashx编译
  • 原文地址:https://www.cnblogs.com/tiancai/p/8283182.html
Copyright © 2011-2022 走看看