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();
}
}
}