动态创建程序集

using System;
using System.Reflection;
using System.Threading;
using System.Reflection.Emit;

namespace TestDriver
{
 public interface ISayHello
 {
  int SayHello();
 }
 public class ReflectionTest
 {
  private Assembly EmitAssembly(string sMsg)
  {
   AssemblyName assemblyName = new AssemblyName();
   assemblyName.Name="SayHelloAssembly";

   AssemblyBuilder newAssembly = Thread.GetDomain().DefineDynamicAssembly(assemblyName,AssemblyBuilderAccess.Run);

   ModuleBuilder newModule = newAssembly.DefineDynamicModule("SayHello");

   TypeBuilder myType = newModule.DefineType("MySayHello",TypeAttributes.Public|TypeAttributes.Class);

   myType.AddInterfaceImplementation(typeof(ISayHello));

   Type[] paramTypes = new Type[0];
   Type returnType  = typeof(int);

   MethodBuilder simpleMethod = myType.DefineMethod("SayHello",
    MethodAttributes.Public | MethodAttributes.Virtual,
    returnType,
    paramTypes);

   ILGenerator generator = simpleMethod.GetILGenerator();

   generator.EmitWriteLine("Hello"+sMsg);  //编写代码

   generator.Emit(OpCodes.Ldc_I4,1);       //入栈

   generator.Emit(OpCodes.Ret);            //返回栈顶

   MethodInfo sayHelloInfo = typeof(ISayHello).GetMethod("SayHello");

   myType.DefineMethodOverride(simpleMethod,sayHelloInfo); //规定方法重载

   myType.CreateType();//创建类型
   return newAssembly;
  }
  public int DoSayHello(string sMsg)
  {
   if(sayHello == null)
   {
    GenerateCode(sMsg);
   }

   return (sayHello.SayHello());
  }
  public void GenerateCode(string sMsg)
  {
   Assembly theAssembly = EmitAssembly(sMsg);
   sayHello = (ISayHello)theAssembly.CreateInstance("MySayHello");
  }
  private ISayHello sayHello;
 }

 class Class1
 {
  static void Main(string[] args)
  {
   ReflectionTest t = new ReflectionTest();
   int i= t.DoSayHello("Wang XianJin");
   Console.WriteLine(i);
   Console.ReadLine();
  }
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值