反射发出(Reflection.Emit)生成MSIL,并算出结果的例子
public Type CreateType(string assemblyName, string moduleName, string className, string methodName, string[] values)
{
try
{
AssemblyName name = new AssemblyName();
name.Name = assemblyName;
AppDomain domain = System.Threading.Thread.GetDomain();
AssemblyBuilder assBuilder = domain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run);
ModuleBuilder mb = assBuilder.DefineDynamicModule(moduleName);
TypeBuilder theClass = mb.DefineType(className, TypeAttributes.Public & TypeAttributes.Class);
Type rtnType = typeof(int);
MethodBuilder method = theClass.DefineMethod(methodName, MethodAttributes.Public, rtnType, null);
ILGenerator gen = method.GetILGenerator();
gen.Emit(OpCodes.Ldc_I4, 0);
for (int i = 0; i < values.Length; i++)
{
gen.Emit(OpCodes.Ldc_I4, int.Parse(values[i]));
gen.Emit(OpCodes.Add);
}
gen.Emit(OpCodes.Ret);
return theClass.CreateType();
}
catch (Exception ex)
{
return null;
}
}
{
try
{
AssemblyName name = new AssemblyName();
name.Name = assemblyName;
AppDomain domain = System.Threading.Thread.GetDomain();
AssemblyBuilder assBuilder = domain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run);
ModuleBuilder mb = assBuilder.DefineDynamicModule(moduleName);
TypeBuilder theClass = mb.DefineType(className, TypeAttributes.Public & TypeAttributes.Class);
Type rtnType = typeof(int);
MethodBuilder method = theClass.DefineMethod(methodName, MethodAttributes.Public, rtnType, null);
ILGenerator gen = method.GetILGenerator();
gen.Emit(OpCodes.Ldc_I4, 0);
for (int i = 0; i < values.Length; i++)
{
gen.Emit(OpCodes.Ldc_I4, int.Parse(values[i]));
gen.Emit(OpCodes.Add);
}
gen.Emit(OpCodes.Ret);
return theClass.CreateType();
}
catch (Exception ex)
{
return null;
}
}
string[] values = new string[] { "1", "2", "3", "4" };
Type MathOpsClass = CreateType("OurAssembly","OurModule", "MathOps", "ReturnSum", values);
object MathOpsInst = Activator.CreateInstance(MathOpsClass);
object obj3 = MathOpsClass.InvokeMember("ReturnSum",BindingFlags.InvokeMethod,null,MathOpsInst,null);
Response.Write(obj3.ToString());
Type MathOpsClass = CreateType("OurAssembly","OurModule", "MathOps", "ReturnSum", values);
object MathOpsInst = Activator.CreateInstance(MathOpsClass);
object obj3 = MathOpsClass.InvokeMember("ReturnSum",BindingFlags.InvokeMethod,null,MathOpsInst,null);
Response.Write(obj3.ToString());