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

    }


 
}
复制代码

 

posted @   甜菜波波  阅读(4025)  评论(1编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示