C# 动态生成程序集


假设有一个ITest接口,它有两个实现分别是TestClass1,和TestClass2,这时候如果需要一个TestClass4类但是现有程序里又没有这个类,就可以在运行时生成一个这样的类

这个应该是可以用来实现AOP,

    public interface ITest
    {
        void Run();
    }

    public class TestClass1 : ITest
    {
        public void Run()
        {
            Console.WriteLine("TestClass1");
        }
    }
    public class TestClass2 : ITest
    {
        public void Run()
        {
            Console.WriteLine("TestClass2");
        }
    }

    public class TestClass4 : ITest
    {
        public void Run()
        {
            ITest t1 = new TestClass1();
            t1.Run();
            ITest t2 = new TestClass2();
            t2.Run();
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            const string ASSEMBLY_NAME = "MyDynamicAssembly";

            AppDomain appDomain = AppDomain.CurrentDomain;

            AssemblyName assemblyName = new AssemblyName(ASSEMBLY_NAME);

            AssemblyBuilder assemblyBuilder = appDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndCollect);

            ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, assemblyName.Name + ".dll");

            TypeBuilder typeBuilder = moduleBuilder.DefineType("TestClass3", TypeAttributes.Public | TypeAttributes.Class);

            typeBuilder.AddInterfaceImplementation(typeof(ITest));

            MethodBuilder methodBuilder = typeBuilder.DefineMethod("Run", MethodAttributes.Public | MethodAttributes.Virtual);

            ILGenerator iLGenerator = methodBuilder.GetILGenerator();

            iLGenerator.DeclareLocal(typeof(ITest));

            iLGenerator.Emit(OpCodes.Nop);
            iLGenerator.Emit(OpCodes.Newobj, typeof(TestClass1).GetConstructors().First());
            iLGenerator.Emit(OpCodes.Stloc_0);
            iLGenerator.Emit(OpCodes.Ldloc_0);
            iLGenerator.Emit(OpCodes.Callvirt, typeof(ITest).GetMethod("Run"));
            iLGenerator.Emit(OpCodes.Nop);

            iLGenerator.Emit(OpCodes.Nop);
            iLGenerator.Emit(OpCodes.Newobj, typeof(TestClass2).GetConstructors().First());
            iLGenerator.Emit(OpCodes.Stloc_0);
            iLGenerator.Emit(OpCodes.Ldloc_0);
            iLGenerator.Emit(OpCodes.Callvirt, typeof(ITest).GetMethod("Run"));
            iLGenerator.Emit(OpCodes.Nop);

            iLGenerator.Emit(OpCodes.Ret);

            Type type = typeBuilder.CreateType();

            ITest t = (ITest)Activator.CreateInstance(type);

            t.Run();

            Console.ReadLine();
        }
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值