private static void EmitToAssembly(ExpressionElement rootElement, IServiceContainer services) { AssemblyName assemblyName = new AssemblyName(EmitAssemblyName); string assemblyFileName = string.Format("{0}.dll", EmitAssemblyName); AssemblyBuilder assemblyBuilder = System.AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Save); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyFileName, assemblyFileName); MethodBuilder mb = moduleBuilder.DefineGlobalMethod("Evaluate", MethodAttributes.Public | MethodAttributes.Static, typeof(T), new Type[] { typeof(object), typeof(ExpressionContext), typeof(VariableCollection) }); FleeILGenerator ilg = new FleeILGenerator(mb.GetILGenerator()); rootElement.Emit(ilg, services); moduleBuilder.CreateGlobalFunctions(); assemblyBuilder.Save(assemblyFileName); }
/// <summary> /// Emit to an assembly. We've already computed long branches at this point, /// so we emit as a second pass /// </summary> /// <param name="ilg"></param> /// <param name="rootElement"></param> /// <param name="services"></param> private static void EmitToAssembly(FleeILGenerator ilg, ExpressionElement rootElement, IServiceContainer services) { AssemblyName assemblyName = new AssemblyName(EmitAssemblyName); string assemblyFileName = string.Format("{0}.dll", EmitAssemblyName); AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyFileName); MethodBuilder mb = moduleBuilder.DefineGlobalMethod("Evaluate", MethodAttributes.Public | MethodAttributes.Static, typeof(T), new Type[] { typeof(object), typeof(ExpressionContext), typeof(VariableCollection) }); // already emitted once for local use, ilg.PrepareSecondPass(mb.GetILGenerator()); rootElement.Emit(ilg, services); moduleBuilder.CreateGlobalFunctions(); //assemblyBuilder.Save(assemblyFileName); assemblyBuilder.CreateInstance(assemblyFileName); }