zoukankan      html  css  js  c++  java
  • 使用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();
            }

  • 相关阅读:
    博客搬到CSDN了,以后就老实的呆在这儿吧~~
    Android对px和dip进行尺寸转换的方法
    获取Java的32位MD5实现
    GDI+ Hello World
    WTL对话框添加背景图片
    WTL对话框添加背景图片
    WTL设置对话框背影色
    WTL设置对话框背影色
    使用CStatic显示图片(bmp、ico、png)
    WTL Picture Control显示图片
  • 原文地址:https://www.cnblogs.com/student-note/p/12497086.html
Copyright © 2011-2022 走看看