public static void DumpToLibrary <T>(GenerationContextBase context, Action <GenerationContextBase> generateCodeAction, string postfix = null) { var invokeMethod = typeof(T).GetMethod("Invoke"); var returnType = invokeMethod.ReturnType; var argumentTypes = invokeMethod.GetParameters().Select(x => x.ParameterType).ToArray(); if (postfix != null) { foreach (var c in new[] { '`', '<', '>', ',', '[', ']' }) { postfix = postfix.Replace(c, '_'); } } var name = string.Format("{0}_{1}", counter++, postfix); var aname = new AssemblyName(name); var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(aname, AssemblyBuilderAccess.Save); var customAttribute = new CustomAttributeBuilder( typeof(DebuggableAttribute).GetConstructor(new[] { typeof(DebuggableAttribute.DebuggingModes) }), new object[] { DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.Default } ); assembly.SetCustomAttribute(customAttribute); var module = assembly.DefineDynamicModule(aname.Name, aname.Name + ".dll", true); var type = module.DefineType("T"); var method = type.DefineMethod("M", MethodAttributes.Public, returnType, argumentTypes); var generator = method.GetILGenerator(); generateCodeAction(context.WithGenerator(generator)); generator.Emit(OpCodes.Ret); type.CreateType(); assembly.Save(aname.Name + ".dll"); }