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); }
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) })); }