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