文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>(转)通过反射动态生成程序集

(转)通过反射动态生成程序集

时间:2010-09-16  来源:loogn

//下面的程序将动态生成一个名为 Math.dll 的程序集,并动态加载其中的 IntOp类,调用其 Add 方法.
using System;
using System.Reflection;
using System.Reflection.Emit;

public class Test
{
     public static Assembly CreateAssembly()
     {
         //定义程序集对象名
         AssemblyName assemblyName = new AssemblyName();
         assemblyName.Name = "Math";

         //创建程序集
         AssemblyBuilder createdAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);

         //定义程序集模块
         ModuleBuilder assemblyModule = createdAssembly.DefineDynamicModule("MathMoudle", "Math.dll");

         //定义类型
         TypeBuilder mathType = assemblyModule.DefineType("IntOp", TypeAttributes.Public | TypeAttributes.Class);

         //创建方法
         System.Type[] paramTypes = new Type[] { typeof(int), typeof(int) };
         MethodBuilder addMethod = mathType.DefineMethod("Add", MethodAttributes.Public, typeof(int), paramTypes);

         //创建方法的参数
         ParameterBuilder param1 = addMethod.DefineParameter(1, ParameterAttributes.In, "num1");
         ParameterBuilder param2 = addMethod.DefineParameter(2, ParameterAttributes.In, "num2");

         //生成方法的中间语言代码
         ILGenerator ilGenerator = addMethod.GetILGenerator();
         ilGenerator.Emit(OpCodes.Ldarg_1);
         ilGenerator.Emit(OpCodes.Ldarg_2);
         ilGenerator.Emit(OpCodes.Add);
         ilGenerator.Emit(OpCodes.Ret);

         //创建类型
         mathType.CreateType();

         //创建程序集
         createdAssembly.Save("Math.dll");
         return createdAssembly;
     }
     /// <summary>
     /// 动态调用程序集中的类的方法
     /// </summary>
     /// <param name="assembly">应用程序构造块</param>
     /// <param name="className">类名</param>
     /// <param name="methodName">方法名</param>
     /// <param name="args">参数组</param>
     /// <returns></returns>
     static object CallAssembly(Assembly assembly, string className, string methodName, object[] args)
     {
         //获取动态加载的类型
         Type t = assembly.GetType(className);

         //构造类型实例
         object obj = Activator.CreateInstance(t);
        
         //获取要调用的方法
         MethodInfo mi = t.GetMethod(methodName);

         //调用方法,返回结果
         return mi.Invoke(obj, args);
     }

     static void Main()
     {
         //动态创建程序集
         Assembly a = CreateAssembly();
        

         //动态调用程序集中类型的方法
         object[] args = new object[] { 2, 3 };
         int i = (int)CallAssembly(a, "IntOp", "Add", args);
         Console.WriteLine(i);
     }
}

 

转自:http://hi.baidu.com/jommyfang/blog/item/388fb11b2359861a8618bfcd.html

 

这里:http://www.cnblogs.com/yingql/archive/2009/03/28/1423999.html

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载