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