反射发出(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;
        }



    }
 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());
posted @ 2007-08-17 15:07  永不言败  阅读(390)  评论(0编辑  收藏  举报