c#动态实现程序集 Emit

 public static void CreatAssembly()
        {
            AssemblyName MyAssemblyName = new AssemblyName("AssemblyName");
            AssemblyBuilder MyAssemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(MyAssemblyName, AssemblyBuilderAccess.RunAndSave);
            ModuleBuilder MyModuleBuilder = MyAssemblyBuilder.DefineDynamicModule("MyModule", "MyModule.dll");//创建模块
            TypeBuilder MyType = MyModuleBuilder.DefineType("MyClass", TypeAttributes.Public);//创建类型(类)

            MethodBuilder MyMethodBuilder = MyType.DefineMethod("AddAB", MethodAttributes.Public, typeof(string), new Type[] { typeof(int), typeof(int) });//创建方法

            #region 实现方法
            ILGenerator MyMethod = MyMethodBuilder.GetILGenerator();
            MyMethod.Emit(OpCodes.Ldarg_1);//参数1压入堆栈
            MyMethod.Emit(OpCodes.Ldc_I4_1);//将int32的1压入堆栈中
            MyMethod.Emit(OpCodes.Add);//
            MyMethod.Emit(OpCodes.Ldarg_2);//参数2压入堆栈
            MyMethod.Emit(OpCodes.Add);
            MyMethod.Emit(OpCodes.Call, typeof(Convert).GetMethod("ToString", new Type[] { typeof(int) }));//把堆栈中的值传Conver.ToString在压入堆栈中
            MyMethod.Emit(OpCodes.Ret);//返回堆栈中
            #endregion

            Type NewType = MyType.CreateType();
            MyAssemblyBuilder.Save("MM.dll");
            object obj = Activator.CreateInstance(NewType);
            Console.WriteLine(NewType.GetMethod("AddAB").Invoke(obj, new object[] { 3, 2 }));

        }

 

posted on 2012-12-25 13:56  R.Ray  阅读(315)  评论(0)    收藏  举报

导航