コード例 #1
0
        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>)));
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }