public void StoreFactoryMap(IAssembly assembly, FactoryMap factoryMap)
        {
            MethodInfo      getTypeFromHandleReflect = typeof(Type).GetMethod("GetTypeFromHandle", new Type[] { typeof(RuntimeTypeHandle) });
            MethodReference getTypeFromHandle        = assembly.Import(getTypeFromHandleReflect);
            TypeReference   systemType          = assembly.Import(typeof(Type));
            TypeReference   arrayOfTypes        = assembly.Import(typeof(Type[]));
            TypeReference   arrayOfArrayOfTypes = assembly.Import(typeof(Type[][]));

            // Now we create the actual type and stuff...
            TypeDefinition   mapType            = GetFactoryMapType(assembly);
            MethodDefinition getFactoriesMethod = new MethodDefinition(FactoryMapMethodName, MethodAttributes.Public, arrayOfArrayOfTypes);

            getFactoriesMethod.IsVirtual = true;
            mapType.Methods.Add(getFactoriesMethod);

            getFactoriesMethod.Body.Variables.Add(new VariableDefinition("map", 0, getFactoriesMethod, arrayOfArrayOfTypes));
            getFactoriesMethod.Body.Variables.Add(new VariableDefinition("row", 1, getFactoriesMethod, arrayOfTypes));
            getFactoriesMethod.Body.InitLocals = true;

            CilWorker      worker    = getFactoriesMethod.Body.CilWorker;
            List <Factory> factories = new List <Factory>(factoryMap.Factories);

            worker.Append(worker.Create(OpCodes.Nop));
            worker.Append(worker.Create(OpCodes.Ldc_I4, factories.Count));
            worker.Append(worker.Create(OpCodes.Newarr, arrayOfTypes));
            worker.Append(worker.Create(OpCodes.Stloc_0));
            worker.Append(worker.Create(OpCodes.Ldloc_0));

            int index = 0;

            foreach (Factory factory in factories)
            {
                worker.Append(worker.Create(OpCodes.Ldc_I4, index));

                worker.Append(worker.Create(OpCodes.Ldc_I4, 2));
                worker.Append(worker.Create(OpCodes.Newarr, systemType));
                worker.Append(worker.Create(OpCodes.Stloc_1));

                worker.Append(worker.Create(OpCodes.Ldloc_1));
                worker.Append(worker.Create(OpCodes.Ldc_I4_0));
                worker.Append(worker.Create(OpCodes.Ldtoken, factory.ObjectType));
                worker.Append(worker.Create(OpCodes.Call, getTypeFromHandle));
                worker.Append(worker.Create(OpCodes.Stelem_Ref));

                worker.Append(worker.Create(OpCodes.Ldloc_1));
                worker.Append(worker.Create(OpCodes.Ldc_I4_1));
                worker.Append(worker.Create(OpCodes.Ldtoken, factory.FactoryType));
                worker.Append(worker.Create(OpCodes.Call, getTypeFromHandle));
                worker.Append(worker.Create(OpCodes.Stelem_Ref));

                worker.Append(worker.Create(OpCodes.Ldloc_1));
                worker.Append(worker.Create(OpCodes.Stelem_Ref));
                index++;
                worker.Append(worker.Create(OpCodes.Ldloc_0));
            }

            worker.Append(worker.Create(OpCodes.Ret));
            assembly.Inject(mapType);
        }
Esempio n. 2
0
        public void StoreFactoryMap(IAssembly assembly, FactoryMap factoryMap)
        {
            MethodInfo getTypeFromHandleReflect = typeof (Type).GetMethod("GetTypeFromHandle", new Type[] { typeof(RuntimeTypeHandle) });
              MethodReference getTypeFromHandle = assembly.Import(getTypeFromHandleReflect);
              TypeReference systemType = assembly.Import(typeof(Type));
              TypeReference arrayOfTypes = assembly.Import(typeof(Type[]));
              TypeReference arrayOfArrayOfTypes = assembly.Import(typeof(Type[][]));

              // Now we create the actual type and stuff...
              TypeDefinition mapType = GetFactoryMapType(assembly);
              MethodDefinition getFactoriesMethod = new MethodDefinition(FactoryMapMethodName, MethodAttributes.Public, arrayOfArrayOfTypes);
              getFactoriesMethod.IsVirtual = true;
              mapType.Methods.Add(getFactoriesMethod);

              getFactoriesMethod.Body.Variables.Add(new VariableDefinition("map", 0, getFactoriesMethod, arrayOfArrayOfTypes));
              getFactoriesMethod.Body.Variables.Add(new VariableDefinition("row", 1, getFactoriesMethod, arrayOfTypes));
              getFactoriesMethod.Body.InitLocals = true;

              CilWorker worker = getFactoriesMethod.Body.CilWorker;
              List<Factory> factories = new List<Factory>(factoryMap.Factories);
              worker.Append(worker.Create(OpCodes.Nop));
              worker.Append(worker.Create(OpCodes.Ldc_I4, factories.Count));
              worker.Append(worker.Create(OpCodes.Newarr, arrayOfTypes));
              worker.Append(worker.Create(OpCodes.Stloc_0));
              worker.Append(worker.Create(OpCodes.Ldloc_0));

              int index = 0;
              foreach (Factory factory in factories)
              {
            worker.Append(worker.Create(OpCodes.Ldc_I4, index));

            worker.Append(worker.Create(OpCodes.Ldc_I4, 2));
            worker.Append(worker.Create(OpCodes.Newarr, systemType));
            worker.Append(worker.Create(OpCodes.Stloc_1));

            worker.Append(worker.Create(OpCodes.Ldloc_1));
            worker.Append(worker.Create(OpCodes.Ldc_I4_0));
            worker.Append(worker.Create(OpCodes.Ldtoken, factory.ObjectType));
            worker.Append(worker.Create(OpCodes.Call, getTypeFromHandle));
            worker.Append(worker.Create(OpCodes.Stelem_Ref));

            worker.Append(worker.Create(OpCodes.Ldloc_1));
            worker.Append(worker.Create(OpCodes.Ldc_I4_1));
            worker.Append(worker.Create(OpCodes.Ldtoken, factory.FactoryType));
            worker.Append(worker.Create(OpCodes.Call, getTypeFromHandle));
            worker.Append(worker.Create(OpCodes.Stelem_Ref));

            worker.Append(worker.Create(OpCodes.Ldloc_1));
            worker.Append(worker.Create(OpCodes.Stelem_Ref));
            index++;
            worker.Append(worker.Create(OpCodes.Ldloc_0));
              }

              worker.Append(worker.Create(OpCodes.Ret));
              assembly.Inject(mapType);
        }