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