using System; using System.Reflection; using System.Reflection.Emit; using System.Text; namespace EmitSample { class Program { static void Main(string[] args) { IRun run = CreateClass.Create(); string result = run.Run(); Console.WriteLine("Result: {0}", result); Console.ReadKey(); } } class CreateClass { private static string _filename = "dynamicAssem.dll"; public static IRun Create() { AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("dynamicAssem"), AssemblyBuilderAccess.RunAndSave); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("dynamicModule", _filename, true); TypeBuilder dynClassBuilder = moduleBuilder.DefineType("DynamicType", TypeAttributes.Public | TypeAttributes.Class); dynClassBuilder.AddInterfaceImplementation(typeof (IRun)); MethodBuilder runBuilder = dynClassBuilder.DefineMethod( "Run", MethodAttributes.Public | MethodAttributes.Virtual, typeof(string), new Type[0]); //HelloWorld(runBuilder); MoreComplexMethod(runBuilder); MethodInfo runMethodInfo = typeof (IRun).GetMethod("Run"); dynClassBuilder.DefineMethodOverride(runBuilder, runMethodInfo); Type t = dynClassBuilder.CreateType(); assemblyBuilder.Save(_filename); return (IRun)Activator.CreateInstance(t); } private static void HelloWorld(MethodBuilder runBuilder) { ILGenerator il = runBuilder.GetILGenerator(); il.EmitWriteLine("Hello World."); il.Emit(OpCodes.Ldnull); il.Emit(OpCodes.Ret); } public static void MoreComplexMethod(MethodBuilder runBuilder) { ILGenerator il = runBuilder.GetILGenerator(); Label endOfMethod = il.DefineLabel(); Type stringBuilderType = typeof (StringBuilder); il.DeclareLocal(stringBuilderType); il.DeclareLocal(typeof(string)); il.Emit(OpCodes.Newobj, stringBuilderType.GetConstructor(new Type[0])); il.Emit(OpCodes.Stloc_0); il.Emit(OpCodes.Ldloc_0); il.Emit(OpCodes.Ldstr, "Hello World (complex)"); il.Emit(OpCodes.Call, stringBuilderType.GetMethod("Append", new Type[] {typeof(string)})); il.Emit(OpCodes.Call, stringBuilderType.GetMethod("ToString", new Type[0])); il.Emit(OpCodes.Stloc_1); il.Emit(OpCodes.Br_S, endOfMethod); il.MarkLabel(endOfMethod); il.Emit(OpCodes.Ldloc_1); il.Emit(OpCodes.Ret); } } public interface IRun { string Run(); } }