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

  • 相关阅读:
    sql中的group by 和 having 用法解析
    关于js的this上下文环境绑定
    windows Service循环任务.服务启动后无法停止重启的解决办法
    js 数组对象的操作方法
    SVN Client API的.net 接口 SharpSvn介紹 Checkout操作实例
    JQuery实现表格的相同单元格合并的三种方法
    SharpSVN出错信息:Can't determine the user's config path,从此证明了百度是个垃圾
    显示js对象所有属性和方法的函数
    软件开发实践的24条军规
    C#中的泛型
  • 原文地址:https://www.cnblogs.com/student-note/p/12497086.html
Copyright © 2011-2022 走看看