(转)通过反射动态生成程序集
时间: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