using System; using System.Reflection.Emit; using System.Reflection; using System.Collections.Generic; using System.Threading; using System.Runtime.InteropServices; namespace PdmSwPlugin.Test.Model { public class HandlerBuilder { public static object test(dynamic target) { MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName; AssemblyName DemoName = new AssemblyName("DynamicAssembly"); AssemblyBuilder dynamicAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(DemoName, AssemblyBuilderAccess.RunAndSave); //动态创建模块 ModuleBuilder mb = dynamicAssembly.DefineDynamicModule(DemoName.Name, DemoName.Name + ".dll"); //动态创建类MyClass TypeBuilder tb = mb.DefineType("MyClass", TypeAttributes.Public); //动态创建字段 FieldBuilder fb = tb.DefineField("target", typeof(string), FieldAttributes.Private); //动态创建构造函数 // Create constructor args and define constructor. Type[] constructorArgs = { typeof(string) }; ConstructorBuilder constructor = tb.DefineConstructor( MethodAttributes.Public, CallingConventions.Standard, constructorArgs); //生成指令 ILGenerator ilg = constructor.GetILGenerator();//生成 Microsoft 中间语言 (MSIL) 指令 ilg.Emit(OpCodes.Ldarg_0); ilg.Emit(OpCodes.Ldarg_1); ilg.Emit(OpCodes.Stfld, fb); ilg.Emit(OpCodes.Ret); //动态创建属性 PropertyBuilder pb = tb.DefineProperty("Target", PropertyAttributes.HasDefault, typeof(string), null); //动态创建方法 MethodBuilder myMethod = tb.DefineMethod("get_Property", getSetAttr, typeof(string), Type.EmptyTypes); ilg = myMethod.GetILGenerator(); ilg.Emit(OpCodes.Ldarg_0); ilg.Emit(OpCodes.Ldfld, fb); ilg.Emit(OpCodes.Ret); pb.SetGetMethod(myMethod); MethodBuilder myMethod2 = tb.DefineMethod("set_Property", getSetAttr, null, new Type[] { typeof(string) }); ilg = myMethod2.GetILGenerator(); ilg.Emit(OpCodes.Ldarg_0); ilg.Emit(OpCodes.Ldarg_1); ilg.Emit(OpCodes.Stfld, fb); ilg.Emit(OpCodes.Ret); pb.SetSetMethod(myMethod2); Type classType = tb.CreateType(); //调用有参数的构造函数 Type[] ciParamsTypes = new Type[] { typeof(string) }; object[] ciParamsValues = new object[] { "Hello World" }; ConstructorInfo ci = classType.GetConstructor(ciParamsTypes); object Vector = ci.Invoke(ciParamsValues); //调用方法 object[] methedParams = new object[] { }; return classType.InvokeMember("get_Property", BindingFlags.InvokeMethod, null, Vector, methedParams); } } }