using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Threading;
public class TestExc : Exception {
public TestExc () {}
}
public class Bla {
public static void thrower () {
Console.WriteLine("thrower");
throw new TestExc ();
}
public static void caller () {
thrower ();
}
public static void buildMethod () {
// create a dynamic assembly and module
AssemblyName assemblyName = new AssemblyName();
assemblyName.Name = "Heusler";
AssemblyBuilder assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
ModuleBuilder module;
module = assemblyBuilder.DefineDynamicModule("Heusler.exe");
// create a new type to hold our Main method
TypeBuilder typeBuilder = module.DefineType("HeuslerType", TypeAttributes.Public | TypeAttributes.Class);
// create the Main(string[] args) method
MethodBuilder methodbuilder = typeBuilder.DefineMethod("Main", MethodAttributes.HideBySig | MethodAttributes.Static | MethodAttributes.Public, typeof(void), new Type[] { typeof(string[]) });
// generate the IL for the Main method
ILGenerator ilGenerator = methodbuilder.GetILGenerator();
ilGenerator.Emit(OpCodes.Call, typeof(Bla).GetMethod("thrower"));
ilGenerator.Emit(OpCodes.Ret);
// bake it
Type heuslerType = typeBuilder.CreateType();
// run it
try {
heuslerType.GetMethod("Main").Invoke(null, new string[] {null});
} catch (TestExc) {
Console.WriteLine("caught");
}
}
public static int Main () {
buildMethod();
return 0;
}
}