使用IL 生成对象和属性

        /// <summary>
        /// 使用Il生成程序
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //1.生成类型 保存到指定DLL中
            AssemblyName asmName = new AssemblyName("ILGratorTest");
            //创建程序集
            var asmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, System.Reflection.Emit.AssemblyBuilderAccess.RunAndSave);
            //创建模块
            var module = asmBuilder.DefineDynamicModule(asmName.Name, asmName.Name + ".dll");
            CreateSimpleClass(module);
            CreateOneConturctorParToParapter(module);
            asmBuilder.Save(asmName.Name + ".dll");
            Console.WriteLine("创建对象成功");
            Console.Read();

        }
        /// <summary>
        /// 生成简单的类型
        /// </summary>
        /// <param name="module"></param>
        static void CreateSimpleClass(ModuleBuilder module)
        {
            var type = module.DefineType("Person", TypeAttributes.Public);
            var conBuilder = type.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, Type.EmptyTypes);
            var conIL = conBuilder.GetILGenerator();
            conIL.Emit(OpCodes.Ldarg_0);
            conIL.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes));
            conIL.Emit(OpCodes.Ret);
            type.CreateType();
        }
        /// <summary>
        /// 创建带一个参数的构造函数,并将值设置到私有变量中
        /// </summary>
        /// <param name="module"></param>
        static void CreateOneConturctorParToParapter(ModuleBuilder module)
        {
            var type = module.DefineType("Person1", TypeAttributes.Public);
            var field = type.DefineField("number", typeof(int), FieldAttributes.Private);
            var ctr1 = type.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { typeof(int) });
            var ILctr1 = ctr1.GetILGenerator();
            //1.调用父类构造函数
            ILctr1.Emit(OpCodes.Ldarg_0);
            ILctr1.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes));
            //2.为私有变量赋值
            ILctr1.Emit(OpCodes.Ldarg_0);
            ILctr1.Emit(OpCodes.Ldarg_1);
            ILctr1.Emit(OpCodes.Stfld, field);
            ILctr1.Emit(OpCodes.Ret);

            //添加第二个构造函数,调用上面的构造函数
            var ctr0 = type.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { typeof(int) });
            var ILctr0 = ctr0.GetILGenerator();
            ILctr0.Emit(OpCodes.Ldarg_0);
            ILctr0.Emit(OpCodes.Ldarg_1);
            ILctr0.Emit(OpCodes.Call, ctr1);
            ILctr0.Emit(OpCodes.Ret);


            //为私有属性添加Get,Set方法
            MethodAttributes getSetAttr = MethodAttributes.Public |
     MethodAttributes.SpecialName | MethodAttributes.HideBySig;

            var propNumber = type.DefineProperty("Number", PropertyAttributes.HasDefault, typeof(int), Type.EmptyTypes);
            var methodNumber = type.DefineMethod("get_Number", getSetAttr, typeof(int), Type.EmptyTypes);
            var ILmethodNumber = methodNumber.GetILGenerator();

            ILmethodNumber.Emit(OpCodes.Ldarg_0);
            ILmethodNumber.Emit(OpCodes.Ldfld, field);
            ILmethodNumber.Emit(OpCodes.Ret);

            //set方法
            var methodSetNumber = type.DefineMethod("set_Number", getSetAttr, null, new Type[] { typeof(int) });
            var ILmethodSetNumber = methodSetNumber.GetILGenerator();
            ILmethodSetNumber.Emit(OpCodes.Ldarg_0);
            ILmethodSetNumber.Emit(OpCodes.Ldarg_1);
            ILmethodSetNumber.Emit(OpCodes.Stfld, field);
            ILmethodSetNumber.Emit(OpCodes.Ret);
            //将两个方法整合
            propNumber.SetGetMethod(methodNumber);
            propNumber.SetSetMethod(methodSetNumber);

            ////添加一个方法 里面有循环
            //var methodLoopTest = type.DefineMethod("loopTest", MethodAttributes.Public, null, Type.EmptyTypes);
            //var ILmethodLoopTest = methodLoopTest.GetILGenerator();
            //var loclare = ILmethodLoopTest.DeclareLocal(typeof(int));
            //ILmethodLoopTest.Emit(OpCodes.Ldarg_0);
            //ILmethodLoopTest.Emit(OpCodes.Ldloc, loclare);
            type.CreateType();
        }

猜你喜欢

转载自www.cnblogs.com/student-note/p/12497086.html