private Func <T> CreateValueGenerator <T>(T value) { DynamicMethod methodBuilder = new DynamicMethod(TestServices.GenerateRandomString(), typeof(T), Type.EmptyTypes); // Generate the method body that simply returns the dictionary ILGenerator ilGenerator = methodBuilder.GetILGenerator(); GenerationServices.LoadValue(ilGenerator, value); ilGenerator.Emit(OpCodes.Ret); return((Func <T>)methodBuilder.CreateDelegate(typeof(Func <T>))); }
public ComposablePartCatalogAssemblyCacheWriter(AssemblyName assemblyName, string cacheDirectory) { Requires.NotNull(assemblyName, "assemblyName"); Requires.NotNullOrEmpty(assemblyName.Name, "assemblyName.Name"); Requires.NotNullOrEmpty(cacheDirectory, "cacheDirectory"); this._assemblyCacheFileName = assemblyName.Name + ".dll"; this._assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Save, cacheDirectory); this._moduleBuilder = this._assemblyBuilder.DefineDynamicModule(assemblyName.Name, this._assemblyCacheFileName); this._generationServices = new GenerationServices(this._moduleBuilder); }
private static void LoadEnumerable(this ILGenerator ilGenerator, IEnumerable enumerable) { Debug.Assert(ilGenerator != null); if (enumerable == null) { throw new ArgumentNullException(nameof(enumerable)); } // We load enumerable as an array - this is the most compact and efficient way of representing it Type elementType = null; Type closedType = null; if (ReflectionServices.TryGetGenericInterfaceType(enumerable.GetType(), GenerationServices.IEnumerableTypeofT, out closedType)) { elementType = closedType.GetGenericArguments()[0]; } else { elementType = typeof(object); } // // elem[] array = new elem[<enumerable.Count()>] // Type generatedArrayType = elementType.MakeArrayType(); LocalBuilder generatedArrayLocal = ilGenerator.DeclareLocal(generatedArrayType); ilGenerator.LoadInt(enumerable.Cast <object>().Count()); ilGenerator.Emit(OpCodes.Newarr, elementType); ilGenerator.Emit(OpCodes.Stloc, generatedArrayLocal); int index = 0; foreach (object value in enumerable) { // //array[<index>] = value; // ilGenerator.Emit(OpCodes.Ldloc, generatedArrayLocal); ilGenerator.LoadInt(index); ilGenerator.LoadValue(value); if (GenerationServices.IsBoxingRequiredForValue(value) && !elementType.IsValueType) { ilGenerator.Emit(OpCodes.Box, value.GetType()); } ilGenerator.Emit(OpCodes.Stelem, elementType); index++; } ilGenerator.Emit(OpCodes.Ldloc, generatedArrayLocal); }