private static void EmitOverride_ReadTMany(TypeBuilder tb, string name, StaticCacheDescription readManyCacheDesc, FieldInfo mapperInstance)
        {
            MethodInfo miDeclaration = typeof(Reader).GetMethod(name, BindingFlags.NonPublic | BindingFlags.Instance);

            MethodBuilder mb = tb.DefineMethod(name, MethodAttributes.Family | MethodAttributes.Virtual);
            GenericTypeParameterBuilder genTypeParam = mb.DefineGenericParameters("T")[0];

            mb.SetReturnType(genTypeParam);
            mb.SetParameters(typeof(uint));
            tb.DefineMethodOverride(mb, miDeclaration);


            FieldInfo fi = readManyCacheDesc.Instance(genTypeParam);

            ILGenerator il      = mb.GetILGenerator();
            Label       noBuild = il.DefineLabel();

            il.Emit(OpCodes.Ldsfld, fi);
            il.Emit(OpCodes.Brtrue, noBuild);
            il.Emit(OpCodes.Ldsfld, mapperInstance);
            il.Emit(OpCodes.Call, typeof(ReadMapper).GetMethod("BuildCaches", BindingFlags.Public | BindingFlags.Instance));
            il.MarkLabel(noBuild);
            il.Emit(OpCodes.Ldsfld, fi);
            il.Emit(OpCodes.Ldarg_0);             // this reader
            il.Emit(OpCodes.Ldarg_1);             // len or max

            MethodInfo miInvoke = TypeBuilder.GetMethod(typeof(ReadManyDelegate <>).MakeGenericType(genTypeParam),
                                                        typeof(ReadManyDelegate <>).GetMethod("Invoke"));

            il.Emit(OpCodes.Callvirt, miInvoke);
            il.Emit(OpCodes.Ret);
        }
Exemple #2
0
        public WriteBuilder()
        {
            string          name       = "DynamicXdrWriteMapper";
            AssemblyName    asmName    = new AssemblyName(name);
            AssemblyBuilder asmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);

            _modBuilder = asmBuilder.DefineDynamicModule(name + ".dll", name + ".dll");

            _buildBinderDescription = new BuildBinderDescription(_modBuilder);
            _oneCacheDescription    = new StaticCacheDescription(_modBuilder, _buildBinderDescription, "OneCache", false, OpaqueType.One);
            _fixCacheDescription    = new StaticCacheDescription(_modBuilder, _buildBinderDescription, "FixCache", false, OpaqueType.Fix);
            _varCacheDescription    = new StaticCacheDescription(_modBuilder, _buildBinderDescription, "VarCache", false, OpaqueType.Var);


            Type dynWriteMapperType = EmitDynWriteMapper();

            _wm = (WriteMapper)Activator.CreateInstance(dynWriteMapperType);

            Type dynWriterType = EmitDynWriter();

            FieldInfo mapperInstance = dynWriterType.GetField("Mapper", BindingFlags.Public | BindingFlags.Static);

            mapperInstance.SetValue(null, _wm);

            _creater = EmitCreater(dynWriterType.GetConstructor(new Type[] { typeof(IByteWriter) }));
        }