
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Reflection;
6 using System.Reflection.Emit;
7 namespace Emit_ConsoleApplication
8 {
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 //构建程序集
14 AssemblyName aName = new AssemblyName("MyEmit");
15 AppDomain aDomain = AppDomain.CurrentDomain;//应用程序域,这里设为当前域
16 AssemblyBuilder aBuidler = aDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Run);
17 //定义模块
18 ModuleBuilder mBuidler = aBuidler.DefineDynamicModule("MyModule");
19 //创建类型(其实就是一个类)
20 TypeBuilder tBuidler = mBuidler.DefineType("MyEmit.MyClass", TypeAttributes.Public | TypeAttributes.Class);
21 //--实现类--//
22 //定义两个私有字段
23 FieldBuilder fb_a = tBuidler.DefineField("a", typeof(double), FieldAttributes.Private);
24 FieldBuilder fb_b = tBuidler.DefineField("b", typeof(double), FieldAttributes.Private);
25 //为私有变量赋值
26 fb_a.SetConstant((double)0);
27 fb_b.SetConstant((double)0);
28 //定义构造函数
29 ConstructorBuilder ctstBuilderWithoutParameters = tBuidler.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, null);//无参数构造函数
30 ILGenerator ctstWithoutParametersGenerator = ctstBuilderWithoutParameters.GetILGenerator();
31 ctstWithoutParametersGenerator.Emit(OpCodes.Ret);
32 ConstructorBuilder ctstBuilder = tBuidler.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, new Type[] { typeof(double), typeof(double) });
33 ILGenerator ctstGenerator=ctstBuilder.GetILGenerator();
34 ctstGenerator.Emit(OpCodes.Ldarg_0);
35 ctstGenerator.Emit(OpCodes.Ldarg_1);
36 ctstGenerator.Emit(OpCodes.Stfld, fb_a);//给字段赋值
37 ctstGenerator.Emit(OpCodes.Ldarg_0);
38 ctstGenerator.Emit(OpCodes.Ldarg_2);
39 ctstGenerator.Emit(OpCodes.Stfld, fb_b);
40
41 ctstGenerator.Emit(OpCodes.Ret);
42 //定义属性
43 PropertyBuilder pro_A = tBuidler.DefineProperty("A", PropertyAttributes.None, typeof(double), null);
44 MethodBuilder mBuidlerGetA = tBuidler.DefineMethod("get", MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, typeof(double), Type.EmptyTypes);//属性的get方法
45 ILGenerator getAGenerator = mBuidlerGetA.GetILGenerator();
46 getAGenerator.Emit(OpCodes.Ldarg_0);
47 getAGenerator.Emit(OpCodes.Ldfld,fb_a);
48 getAGenerator.Emit(OpCodes.Ret);
49 MethodBuilder mBuidlerSetA = tBuidler.DefineMethod("set", MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, null, new Type[]{typeof(double)});
50 ILGenerator setAGenerator = mBuidlerSetA.GetILGenerator();
51 setAGenerator.Emit(OpCodes.Ldarg_0);
52 setAGenerator.Emit(OpCodes.Ldarg_1);
53 setAGenerator.Emit(OpCodes.Ldfld, fb_a);
54 setAGenerator.Emit(OpCodes.Ret);
55 //定义方法
56 MethodBuilder mtdBuidler = tBuidler.DefineMethod("Sum",MethodAttributes.Public,typeof(double),null);
57 ILGenerator mtdGenerator = mtdBuidler.GetILGenerator();
58 mtdGenerator.Emit(OpCodes.Ldarg_0);
59 mtdGenerator.Emit(OpCodes.Ldfld,fb_a);
60 mtdGenerator.Emit(OpCodes.Ldarg_0);
61 mtdGenerator.Emit(OpCodes.Ldfld,fb_b);
62 mtdGenerator.Emit(OpCodes.Add);
63 mtdGenerator.Emit(OpCodes.Ret);
64
65 //创建引用、调用方法
66 Type MyClass = tBuidler.CreateType();
67 object myInstance = Activator.CreateInstance(MyClass,new object[]{1.1,2.2});//实例化
68 //object result = MyClass.InvokeMember("Add", BindingFlags.InvokeMethod, null, myInstance, new object[]{1.2,2.3});
69 object result = MyClass.GetMethod("Sum").Invoke(myInstance,null);
70 Console.WriteLine("this result is {0}", result.ToString());
71 }
72 }
73 }
74
