All pastes #581325 Raw Edit

Stuff

public text v1 · immutable
·published 2007-06-21 13:52 UTC
rendered paste body
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;
	}
}