// File RTCG1.cs --- first runtime code generation experiment // sestoft@itu.dk * 2002 using System; using System.Reflection; using System.Reflection.Emit; class RTCG1 { public static void Main(String [] args) { AssemblyName assemblyName = new AssemblyName(); assemblyName.Name = "myassembly"; // Build: run-only assembly AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); // Build: module mymodule ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("mymodule"); // Build: public class MyClass { ... } TypeBuilder typeBuilder = moduleBuilder.DefineType("MyClass", TypeAttributes.Class | TypeAttributes.Public, typeof(Object)); // Build: public static void MyMethod() { ... } MethodBuilder methodBuilder = typeBuilder.DefineMethod("MyMethod", MethodAttributes.Static | MethodAttributes.Public, typeof(void), new Type[] { }); // Obtain an IL generator to build the method body ILGenerator ilg = methodBuilder.GetILGenerator(); ilg.EmitWriteLine("MyClass.MyMethod() was called"); ilg.Emit(OpCodes.Ret); Type ty = typeBuilder.CreateType(); ty.GetMethod("MyMethod").Invoke(null, new object[] {}); } }