Пример #1
0
        public void CreatePropertyGetter(FieldHandlerCreateImpl ctx)
        {
            var defaultFieldBuilder      = ctx.DefaultFieldBuilder;
            var listImplType             = typeof(ListOfDBObject <>).MakeGenericType(defaultFieldBuilder.FieldType.GetGenericArguments());
            var miGenericCompareExchange = typeof(Interlocked).GetMethods().Single(mi => mi.IsGenericMethod && mi.Name == "CompareExchange");
            var miCompareExchange        = miGenericCompareExchange.MakeGenericMethod(defaultFieldBuilder.FieldType);
            var ilGenerator = ctx.Generator;
            var label       = ilGenerator.DefineLabel();

            ilGenerator
            .Ldarg(0)
            .Ldfld(defaultFieldBuilder)
            .BrtrueS(label)
            .Ldarg(0)
            .Ldflda(defaultFieldBuilder)
            .Ldarg(0)
            .Newobj(listImplType.GetConstructor(new[] { typeof(IDBObject) }))
            .Castclass(defaultFieldBuilder.FieldType)
            .Ldnull()
            .Call(miCompareExchange)
            .Pop()
            .Mark(label)
            .Ldarg(0)
            .Ldfld(defaultFieldBuilder);
        }
Пример #2
0
 public void CreateSaver(FieldHandlerCreateImpl ctx)
 {
     ctx.Generator
     .Ldloc(1)
     .Ldloc(0)
     .Ldfld(ctx.DefaultFieldBuilder)
     .Call(typeof(ListDBObjectFieldHandler).GetMethod("SaverImpl").MakeGenericMethod(ctx.DefaultFieldBuilder.FieldType.GetGenericArguments()));
 }
Пример #3
0
 public void CreateSaver(FieldHandlerCreateImpl ctx)
 {
     ctx.Generator
         .Ldloc(1)
         .Ldloc(0)
         .Ldfld(ctx.DefaultFieldBuilder)
         .Call(() => ((AbstractBufferedWriter)null).WriteVUInt64(0));
 }
Пример #4
0
 public void CreateSaver(FieldHandlerCreateImpl ctx)
 {
     ctx.Generator
     .Ldloc(1)
     .Ldloc(0)
     .Ldfld(ctx.DefaultFieldBuilder)
     .Call(() => ((AbstractBufferedWriter)null).WriteVUInt64(0));
 }
Пример #5
0
 public void CreateSaver(FieldHandlerCreateImpl ctx)
 {
     var willLoad = WillLoad();
     var defaultFieldBuilder = ctx.DefaultFieldBuilder;
     var generateConversion = ctx.TypeConvertorGenerator.GenerateConversion(defaultFieldBuilder.FieldType, willLoad);
     SaveFromWillLoad(ctx.Generator, il => il.Ldloc(1), il =>
     {
         il.Ldloc(0).Ldfld(defaultFieldBuilder);
         generateConversion(il);
     });
 }
Пример #6
0
        public void CreateSaver(FieldHandlerCreateImpl ctx)
        {
            var willLoad            = WillLoad();
            var defaultFieldBuilder = ctx.DefaultFieldBuilder;
            var generateConversion  = ctx.TypeConvertorGenerator.GenerateConversion(defaultFieldBuilder.FieldType, willLoad);

            SaveFromWillLoad(ctx.Generator, il => il.Ldloc(1), il =>
            {
                il.Ldloc(0).Ldfld(defaultFieldBuilder);
                generateConversion(il);
            });
        }
Пример #7
0
 public void CreatePropertyGetter(FieldHandlerCreateImpl ctx)
 {
     var ilGenerator = ctx.Generator;
     ilGenerator
         .Ldarg(0)
         .Ldfld(ctx.FieldMidLevelDBTransaction)
         .Ldarg(0)
         .Ldfld(ctx.DefaultFieldBuilder)
         .Callvirt(() => ((IObjectDBTransactionInternal)null).Get(0));
     if (ctx.PropertyInfo.PropertyType != typeof(object))
     {
         ilGenerator.Isinst(ctx.PropertyInfo.PropertyType);
     }
 }
Пример #8
0
        public void CreatePropertyGetter(FieldHandlerCreateImpl ctx)
        {
            var ilGenerator = ctx.Generator;

            ilGenerator
            .Ldarg(0)
            .Ldfld(ctx.FieldMidLevelDBTransaction)
            .Ldarg(0)
            .Ldfld(ctx.DefaultFieldBuilder)
            .Callvirt(() => ((IObjectDBTransactionInternal)null).Get(0));
            if (ctx.PropertyInfo.PropertyType != typeof(object))
            {
                ilGenerator.Isinst(ctx.PropertyInfo.PropertyType);
            }
        }
Пример #9
0
 public void CreatePropertySetter(FieldHandlerCreateImpl ctx)
 {
     var ilGenerator = ctx.Generator;
     var fieldBuilder = ctx.DefaultFieldBuilder;
     var labelNoChange = ilGenerator.DefineLabel();
     ilGenerator.DeclareLocal(typeof(ulong));
     ilGenerator
         .Ldarg(0)
         .Ldfld(ctx.FieldMidLevelDBTransaction)
         .Ldarg(1)
         .Callvirt(() => ((IObjectDBTransactionInternal)null).GetOid(null))
         .Stloc(0);
     EmitHelpers.GenerateJumpIfEqual(ilGenerator, typeof(ulong), labelNoChange,
                                     g => g.Ldarg(0).Ldfld(fieldBuilder),
                                     g => g.Ldloc(0));
     ilGenerator
         .Ldarg(0)
         .Ldloc(0)
         .Stfld(fieldBuilder);
     ctx.CallObjectModified(ilGenerator);
     ilGenerator
         .Mark(labelNoChange);
 }
Пример #10
0
        public void CreatePropertySetter(FieldHandlerCreateImpl ctx)
        {
            var ilGenerator   = ctx.Generator;
            var fieldBuilder  = ctx.DefaultFieldBuilder;
            var labelNoChange = ilGenerator.DefineLabel();

            ilGenerator.DeclareLocal(typeof(ulong));
            ilGenerator
            .Ldarg(0)
            .Ldfld(ctx.FieldMidLevelDBTransaction)
            .Ldarg(1)
            .Callvirt(() => ((IObjectDBTransactionInternal)null).GetOid(null))
            .Stloc(0);
            EmitHelpers.GenerateJumpIfEqual(ilGenerator, typeof(ulong), labelNoChange,
                                            g => g.Ldarg(0).Ldfld(fieldBuilder),
                                            g => g.Ldloc(0));
            ilGenerator
            .Ldarg(0)
            .Ldloc(0)
            .Stfld(fieldBuilder);
            ctx.CallObjectModified(ilGenerator);
            ilGenerator
            .Mark(labelNoChange);
        }
Пример #11
0
 Type CreateImplType()
 {
     var tableVersionInfo = _tableVersions[ClientTypeVersion];
     AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(Name + "Asm"), AssemblyBuilderAccess.RunAndCollect);
     ModuleBuilder mb = ab.DefineDynamicModule(Name + "Asm.dll", true);
     var symbolDocumentWriter = mb.DefineDocument("just_dynamic_" + Name, Guid.Empty, Guid.Empty, Guid.Empty);
     TypeBuilder tb = mb.DefineType(Name + "Impl", TypeAttributes.Public, typeof(object), new[] { ClientType, typeof(IDBObject) });
     var properties = ClientType.GetProperties();
     var oidFieldBuilder = tb.DefineField("Oid", typeof(ulong), FieldAttributes.InitOnly | FieldAttributes.Public);
     var trFieldBuilder = tb.DefineField("ObjectDBTransaction", typeof(IObjectDBTransactionInternal),
                                         FieldAttributes.InitOnly | FieldAttributes.Public);
     var deletedFieldBuilder = tb.DefineField("_deleted", typeof(bool), FieldAttributes.Family);
     var propInfo = typeof(IDBObject).GetProperty("TableName");
     var getMethodBuilder = tb.DefineMethod("get_" + propInfo.Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.SpecialName, propInfo.PropertyType, Type.EmptyTypes);
     var ilGenerator = getMethodBuilder.GetILGenerator(symbolDocumentWriter, 16);
     ilGenerator.Ldstr(Name).Ret();
     tb.DefineMethodOverride(getMethodBuilder, propInfo.GetGetMethod());
     var propertyBuilder = tb.DefineProperty(propInfo.Name, PropertyAttributes.None, propInfo.PropertyType, Type.EmptyTypes);
     propertyBuilder.SetGetMethod(getMethodBuilder);
     propInfo = typeof(IDBObject).GetProperty("TableId");
     getMethodBuilder = tb.DefineMethod("get_" + propInfo.Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.SpecialName, propInfo.PropertyType, Type.EmptyTypes);
     ilGenerator = getMethodBuilder.GetILGenerator(symbolDocumentWriter, 16);
     ilGenerator.LdcI4((int)Id).Ret();
     tb.DefineMethodOverride(getMethodBuilder, propInfo.GetGetMethod());
     propertyBuilder = tb.DefineProperty(propInfo.Name, PropertyAttributes.None, propInfo.PropertyType, Type.EmptyTypes);
     propertyBuilder.SetGetMethod(getMethodBuilder);
     propInfo = typeof(IDBObject).GetProperty("Oid");
     getMethodBuilder = tb.DefineMethod("get_" + propInfo.Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.SpecialName, propInfo.PropertyType, Type.EmptyTypes);
     ilGenerator = getMethodBuilder.GetILGenerator(symbolDocumentWriter, 16);
     ilGenerator.Ldarg(0).Ldfld(oidFieldBuilder).Ret();
     tb.DefineMethodOverride(getMethodBuilder, propInfo.GetGetMethod());
     propertyBuilder = tb.DefineProperty(propInfo.Name, PropertyAttributes.None, propInfo.PropertyType, Type.EmptyTypes);
     propertyBuilder.SetGetMethod(getMethodBuilder);
     propInfo = typeof(IDBObject).GetProperty("Deleted");
     getMethodBuilder = tb.DefineMethod("get_" + propInfo.Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.SpecialName, propInfo.PropertyType, Type.EmptyTypes);
     ilGenerator = getMethodBuilder.GetILGenerator(symbolDocumentWriter, 16);
     ilGenerator.Ldarg(0).Ldfld(deletedFieldBuilder).Ret();
     tb.DefineMethodOverride(getMethodBuilder, propInfo.GetGetMethod());
     propertyBuilder = tb.DefineProperty(propInfo.Name, PropertyAttributes.None, propInfo.PropertyType, Type.EmptyTypes);
     propertyBuilder.SetGetMethod(getMethodBuilder);
     propInfo = typeof(IDBObject).GetProperty("OwningTransaction");
     getMethodBuilder = tb.DefineMethod("get_" + propInfo.Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.SpecialName, propInfo.PropertyType, Type.EmptyTypes);
     ilGenerator = getMethodBuilder.GetILGenerator(symbolDocumentWriter, 16);
     ilGenerator.Ldarg(0).Ldfld(trFieldBuilder).Castclass(propInfo.PropertyType).Ret();
     tb.DefineMethodOverride(getMethodBuilder, propInfo.GetGetMethod());
     propertyBuilder = tb.DefineProperty(propInfo.Name, PropertyAttributes.None, propInfo.PropertyType, Type.EmptyTypes);
     propertyBuilder.SetGetMethod(getMethodBuilder);
     var constructorBuilder = tb.DefineConstructor(MethodAttributes.Family, CallingConventions.Standard,
                                                   new[] { typeof(ulong), typeof(IObjectDBTransactionInternal) });
     var ilg = constructorBuilder.GetILGenerator();
     ilg.MarkSequencePoint(symbolDocumentWriter, 1, 1, 1, 1);
     ilg
         .Ldarg(0)
         .Call(() => new object())
         .Ldarg(0)
         .Ldarg(1)
         .Stfld(oidFieldBuilder)
         .Ldarg(0)
         .Ldarg(2)
         .Stfld(trFieldBuilder)
         .Ret();
     var metbCi = tb.DefineMethod("CreateInstance",
         MethodAttributes.Public | MethodAttributes.Static, typeof(object), new[] { typeof(ulong), typeof(IObjectDBTransactionInternal) });
     ilg = metbCi.GetILGenerator(symbolDocumentWriter);
     ilg
         .Ldarg(0)
         .Ldarg(1)
         .Newobj(constructorBuilder)
         .Ret();
     var metb = tb.DefineMethod("Inserter",
                     MethodAttributes.Public | MethodAttributes.Static, typeof(object), new[] { typeof(IObjectDBTransactionInternal), typeof(ulong) });
     ilg = metb.GetILGenerator(symbolDocumentWriter);
     ilg.DeclareLocal(typeof(object));
     ilg
         .Ldarg(1)
         .Ldarg(0)
         .Call(metbCi)
         .Stloc(0)
         .Ldarg(0)
         .Ldarg(1)
         .Ldloc(0)
         .Callvirt(() => ((IObjectDBTransactionInternal)null).RegisterNewObject(0, null))
         .Ldloc(0)
         .Ret();
     metb = tb.DefineMethod("Delete",
                     MethodAttributes.Public | MethodAttributes.Virtual, typeof(void), Type.EmptyTypes);
     ilg = metb.GetILGenerator(symbolDocumentWriter);
     ilg
         .Ldarg(0)
         .LdcI4(1)
         .Stfld(deletedFieldBuilder)
         .Ldarg(0)
         .Ldfld(trFieldBuilder)
         .Ldarg(0)
         .Tail().Callvirt(() => ((IObjectDBTransactionInternal)null).InternalDelete(null))
         .Ret();
     metb = tb.DefineMethod("Saver",
         MethodAttributes.Public | MethodAttributes.Static, typeof(void), new[] { typeof(object) });
     ilg = metb.GetILGenerator(symbolDocumentWriter);
     ilg.DeclareLocal(tb);
     ilg.DeclareLocal(typeof(AbstractBufferedWriter));
     var skipException = ilg.DefineLabel();
     ilg
         .Ldarg(0)
         .Isinst(tb)
         .Stloc(0)
         .Ldloc(0)
         .BrtrueS(skipException)
         .Ldstr("Type of object in Saver does not match")
         .Newobj(() => new BTDBException(null))
         .Throw()
         .Mark(skipException)
         .Ldloc(0)
         .Ldfld(trFieldBuilder)
         .Ldloc(0)
         .Ldfld(oidFieldBuilder)
         .Callvirt(() => ((IObjectDBTransactionInternal)null).PrepareToWriteObject(0))
         .Stloc(1)
         .Ldloc(1)
         .LdcI4((int)Id)
         .Call(() => ((AbstractBufferedWriter)null).WriteVUInt32(0))
         .Ldloc(1)
         .LdcI4((int)ClientTypeVersion)
         .Call(() => ((AbstractBufferedWriter)null).WriteVUInt32(0));
     var objHolder = new Dictionary<string, object>();
     for (int fieldIndex = 0; fieldIndex < tableVersionInfo.FieldCount; fieldIndex++)
     {
         var tableFieldInfo = tableVersionInfo[fieldIndex];
         var property = properties.First(pi => pi.Name == tableFieldInfo.Name);
         var fieldHandlerCreateImpl = new FieldHandlerCreateImpl
             {
                 FieldName = tableFieldInfo.Name,
                 TableName = Name,
                 ImplType = tb,
                 TypeConvertorGenerator = _tableInfoResolver.TypeConvertorGenerator,
                 SymbolDocWriter = symbolDocumentWriter,
                 ObjectStorage = objHolder,
                 Generator = null,
                 PropertyInfo = property,
                 FieldMidLevelDBTransaction = trFieldBuilder,
                 CallObjectModified = generator =>
                     {
                         generator.Ldarg(0);
                         generator.Ldfld(trFieldBuilder);
                         generator.Ldarg(0);
                         generator.Callvirt(() => ((IObjectDBTransactionInternal)null).ObjectModified(null));
                     }
             };
         tableFieldInfo.Handler.CreateStorage(fieldHandlerCreateImpl);
         propertyBuilder = tb.DefineProperty(property.Name, PropertyAttributes.None, property.PropertyType, Type.EmptyTypes);
         if (property.CanRead)
         {
             getMethodBuilder = tb.DefineMethod("get_" + property.Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.SpecialName, property.PropertyType, Type.EmptyTypes);
             ilGenerator = getMethodBuilder.GetILGenerator(symbolDocumentWriter);
             ilGenerator
                 .Ldarg(0)
                 .Ldfld(trFieldBuilder)
                 .Ldarg(0)
                 .Callvirt(() => ((IObjectDBTransactionInternal)null).CheckPropertyOperationValidity(null));
             fieldHandlerCreateImpl.Generator = ilGenerator;
             tableFieldInfo.Handler.CreatePropertyGetter(fieldHandlerCreateImpl);
             ilGenerator.Ret();
             tb.DefineMethodOverride(getMethodBuilder, property.GetGetMethod());
             propertyBuilder.SetGetMethod(getMethodBuilder);
         }
         if (property.CanWrite)
         {
             var setMethodBuilder = tb.DefineMethod("set_" + property.Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.SpecialName, typeof(void),
                                                    new[] { property.PropertyType });
             ilGenerator = setMethodBuilder.GetILGenerator(symbolDocumentWriter);
             ilGenerator
                 .Ldarg(0)
                 .Ldfld(trFieldBuilder)
                 .Ldarg(0)
                 .Callvirt(() => ((IObjectDBTransactionInternal)null).CheckPropertyOperationValidity(null));
             fieldHandlerCreateImpl.Generator = ilGenerator;
             tableFieldInfo.Handler.CreatePropertySetter(fieldHandlerCreateImpl);
             ilGenerator.Ret();
             propertyBuilder.SetSetMethod(setMethodBuilder);
         }
         fieldHandlerCreateImpl.Generator = ilg;
         tableFieldInfo.Handler.CreateSaver(fieldHandlerCreateImpl);
     }
     ilg.Ldloc(1);
     ilg.Castclass(typeof(IDisposable));
     ilg.Callvirt(() => ((IDisposable)null).Dispose());
     ilg.Ret();
     Type result = tb.CreateType();
     //ab.Save(Name + "asm.dll");
     return result;
 }
Пример #12
0
 public void CreateStorage(FieldHandlerCreateImpl ctx)
 {
     ctx.CreateSimpleStorage(typeof(ulong));
 }
Пример #13
0
 public void CreateStorage(FieldHandlerCreateImpl ctx)
 {
     ctx.CreateSimpleStorage();
 }
Пример #14
0
 public void CreatePropertySetter(FieldHandlerCreateImpl ctx)
 {
     ctx.CreateSimplePropertySetter();
 }
Пример #15
0
 public void CreateStorage(FieldHandlerCreateImpl ctx)
 {
     ctx.CreateSimpleStorage(typeof(ulong));
 }
Пример #16
0
 public void CreatePropertySetter(FieldHandlerCreateImpl ctx)
 {
     throw new BTDBException(string.Format("Property {0} in {1} must be read only", ctx.FieldName, ctx.TableName));
 }
Пример #17
0
 public void CreatePropertySetter(FieldHandlerCreateImpl ctx)
 {
     ctx.CreateSimplePropertySetter();
 }
Пример #18
0
 public void CreateStorage(FieldHandlerCreateImpl ctx)
 {
     ctx.CreateSimpleStorage();
 }
Пример #19
0
        Type CreateImplType()
        {
            var             tableVersionInfo = _tableVersions[ClientTypeVersion];
            AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(Name + "Asm"), AssemblyBuilderAccess.RunAndCollect);
            ModuleBuilder   mb = ab.DefineDynamicModule(Name + "Asm.dll", true);
            var             symbolDocumentWriter = mb.DefineDocument("just_dynamic_" + Name, Guid.Empty, Guid.Empty, Guid.Empty);
            TypeBuilder     tb              = mb.DefineType(Name + "Impl", TypeAttributes.Public, typeof(object), new[] { ClientType, typeof(IDBObject) });
            var             properties      = ClientType.GetProperties();
            var             oidFieldBuilder = tb.DefineField("Oid", typeof(ulong), FieldAttributes.InitOnly | FieldAttributes.Public);
            var             trFieldBuilder  = tb.DefineField("ObjectDBTransaction", typeof(IObjectDBTransactionInternal),
                                                             FieldAttributes.InitOnly | FieldAttributes.Public);
            var deletedFieldBuilder = tb.DefineField("_deleted", typeof(bool), FieldAttributes.Family);
            var propInfo            = typeof(IDBObject).GetProperty("TableName");
            var getMethodBuilder    = tb.DefineMethod("get_" + propInfo.Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.SpecialName, propInfo.PropertyType, Type.EmptyTypes);
            var ilGenerator         = getMethodBuilder.GetILGenerator(symbolDocumentWriter, 16);

            ilGenerator.Ldstr(Name).Ret();
            tb.DefineMethodOverride(getMethodBuilder, propInfo.GetGetMethod());
            var propertyBuilder = tb.DefineProperty(propInfo.Name, PropertyAttributes.None, propInfo.PropertyType, Type.EmptyTypes);

            propertyBuilder.SetGetMethod(getMethodBuilder);
            propInfo         = typeof(IDBObject).GetProperty("TableId");
            getMethodBuilder = tb.DefineMethod("get_" + propInfo.Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.SpecialName, propInfo.PropertyType, Type.EmptyTypes);
            ilGenerator      = getMethodBuilder.GetILGenerator(symbolDocumentWriter, 16);
            ilGenerator.LdcI4((int)Id).Ret();
            tb.DefineMethodOverride(getMethodBuilder, propInfo.GetGetMethod());
            propertyBuilder = tb.DefineProperty(propInfo.Name, PropertyAttributes.None, propInfo.PropertyType, Type.EmptyTypes);
            propertyBuilder.SetGetMethod(getMethodBuilder);
            propInfo         = typeof(IDBObject).GetProperty("Oid");
            getMethodBuilder = tb.DefineMethod("get_" + propInfo.Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.SpecialName, propInfo.PropertyType, Type.EmptyTypes);
            ilGenerator      = getMethodBuilder.GetILGenerator(symbolDocumentWriter, 16);
            ilGenerator.Ldarg(0).Ldfld(oidFieldBuilder).Ret();
            tb.DefineMethodOverride(getMethodBuilder, propInfo.GetGetMethod());
            propertyBuilder = tb.DefineProperty(propInfo.Name, PropertyAttributes.None, propInfo.PropertyType, Type.EmptyTypes);
            propertyBuilder.SetGetMethod(getMethodBuilder);
            propInfo         = typeof(IDBObject).GetProperty("Deleted");
            getMethodBuilder = tb.DefineMethod("get_" + propInfo.Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.SpecialName, propInfo.PropertyType, Type.EmptyTypes);
            ilGenerator      = getMethodBuilder.GetILGenerator(symbolDocumentWriter, 16);
            ilGenerator.Ldarg(0).Ldfld(deletedFieldBuilder).Ret();
            tb.DefineMethodOverride(getMethodBuilder, propInfo.GetGetMethod());
            propertyBuilder = tb.DefineProperty(propInfo.Name, PropertyAttributes.None, propInfo.PropertyType, Type.EmptyTypes);
            propertyBuilder.SetGetMethod(getMethodBuilder);
            propInfo         = typeof(IDBObject).GetProperty("OwningTransaction");
            getMethodBuilder = tb.DefineMethod("get_" + propInfo.Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.SpecialName, propInfo.PropertyType, Type.EmptyTypes);
            ilGenerator      = getMethodBuilder.GetILGenerator(symbolDocumentWriter, 16);
            ilGenerator.Ldarg(0).Ldfld(trFieldBuilder).Castclass(propInfo.PropertyType).Ret();
            tb.DefineMethodOverride(getMethodBuilder, propInfo.GetGetMethod());
            propertyBuilder = tb.DefineProperty(propInfo.Name, PropertyAttributes.None, propInfo.PropertyType, Type.EmptyTypes);
            propertyBuilder.SetGetMethod(getMethodBuilder);
            var constructorBuilder = tb.DefineConstructor(MethodAttributes.Family, CallingConventions.Standard,
                                                          new[] { typeof(ulong), typeof(IObjectDBTransactionInternal) });
            var ilg = constructorBuilder.GetILGenerator();

            ilg.MarkSequencePoint(symbolDocumentWriter, 1, 1, 1, 1);
            ilg
            .Ldarg(0)
            .Call(() => new object())
            .Ldarg(0)
            .Ldarg(1)
            .Stfld(oidFieldBuilder)
            .Ldarg(0)
            .Ldarg(2)
            .Stfld(trFieldBuilder)
            .Ret();
            var metbCi = tb.DefineMethod("CreateInstance",
                                         MethodAttributes.Public | MethodAttributes.Static, typeof(object), new[] { typeof(ulong), typeof(IObjectDBTransactionInternal) });

            ilg = metbCi.GetILGenerator(symbolDocumentWriter);
            ilg
            .Ldarg(0)
            .Ldarg(1)
            .Newobj(constructorBuilder)
            .Ret();
            var metb = tb.DefineMethod("Inserter",
                                       MethodAttributes.Public | MethodAttributes.Static, typeof(object), new[] { typeof(IObjectDBTransactionInternal), typeof(ulong) });

            ilg = metb.GetILGenerator(symbolDocumentWriter);
            ilg.DeclareLocal(typeof(object));
            ilg
            .Ldarg(1)
            .Ldarg(0)
            .Call(metbCi)
            .Stloc(0)
            .Ldarg(0)
            .Ldarg(1)
            .Ldloc(0)
            .Callvirt(() => ((IObjectDBTransactionInternal)null).RegisterNewObject(0, null))
            .Ldloc(0)
            .Ret();
            metb = tb.DefineMethod("Delete",
                                   MethodAttributes.Public | MethodAttributes.Virtual, typeof(void), Type.EmptyTypes);
            ilg = metb.GetILGenerator(symbolDocumentWriter);
            ilg
            .Ldarg(0)
            .LdcI4(1)
            .Stfld(deletedFieldBuilder)
            .Ldarg(0)
            .Ldfld(trFieldBuilder)
            .Ldarg(0)
            .Tail().Callvirt(() => ((IObjectDBTransactionInternal)null).InternalDelete(null))
            .Ret();
            metb = tb.DefineMethod("Saver",
                                   MethodAttributes.Public | MethodAttributes.Static, typeof(void), new[] { typeof(object) });
            ilg = metb.GetILGenerator(symbolDocumentWriter);
            ilg.DeclareLocal(tb);
            ilg.DeclareLocal(typeof(AbstractBufferedWriter));
            var skipException = ilg.DefineLabel();

            ilg
            .Ldarg(0)
            .Isinst(tb)
            .Stloc(0)
            .Ldloc(0)
            .BrtrueS(skipException)
            .Ldstr("Type of object in Saver does not match")
            .Newobj(() => new BTDBException(null))
            .Throw()
            .Mark(skipException)
            .Ldloc(0)
            .Ldfld(trFieldBuilder)
            .Ldloc(0)
            .Ldfld(oidFieldBuilder)
            .Callvirt(() => ((IObjectDBTransactionInternal)null).PrepareToWriteObject(0))
            .Stloc(1)
            .Ldloc(1)
            .LdcI4((int)Id)
            .Call(() => ((AbstractBufferedWriter)null).WriteVUInt32(0))
            .Ldloc(1)
            .LdcI4((int)ClientTypeVersion)
            .Call(() => ((AbstractBufferedWriter)null).WriteVUInt32(0));
            var objHolder = new Dictionary <string, object>();

            for (int fieldIndex = 0; fieldIndex < tableVersionInfo.FieldCount; fieldIndex++)
            {
                var tableFieldInfo         = tableVersionInfo[fieldIndex];
                var property               = properties.First(pi => pi.Name == tableFieldInfo.Name);
                var fieldHandlerCreateImpl = new FieldHandlerCreateImpl
                {
                    FieldName = tableFieldInfo.Name,
                    TableName = Name,
                    ImplType  = tb,
                    TypeConvertorGenerator = _tableInfoResolver.TypeConvertorGenerator,
                    SymbolDocWriter        = symbolDocumentWriter,
                    ObjectStorage          = objHolder,
                    Generator    = null,
                    PropertyInfo = property,
                    FieldMidLevelDBTransaction = trFieldBuilder,
                    CallObjectModified         = generator =>
                    {
                        generator.Ldarg(0);
                        generator.Ldfld(trFieldBuilder);
                        generator.Ldarg(0);
                        generator.Callvirt(() => ((IObjectDBTransactionInternal)null).ObjectModified(null));
                    }
                };
                tableFieldInfo.Handler.CreateStorage(fieldHandlerCreateImpl);
                propertyBuilder = tb.DefineProperty(property.Name, PropertyAttributes.None, property.PropertyType, Type.EmptyTypes);
                if (property.CanRead)
                {
                    getMethodBuilder = tb.DefineMethod("get_" + property.Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.SpecialName, property.PropertyType, Type.EmptyTypes);
                    ilGenerator      = getMethodBuilder.GetILGenerator(symbolDocumentWriter);
                    ilGenerator
                    .Ldarg(0)
                    .Ldfld(trFieldBuilder)
                    .Ldarg(0)
                    .Callvirt(() => ((IObjectDBTransactionInternal)null).CheckPropertyOperationValidity(null));
                    fieldHandlerCreateImpl.Generator = ilGenerator;
                    tableFieldInfo.Handler.CreatePropertyGetter(fieldHandlerCreateImpl);
                    ilGenerator.Ret();
                    tb.DefineMethodOverride(getMethodBuilder, property.GetGetMethod());
                    propertyBuilder.SetGetMethod(getMethodBuilder);
                }
                if (property.CanWrite)
                {
                    var setMethodBuilder = tb.DefineMethod("set_" + property.Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.SpecialName, typeof(void),
                                                           new[] { property.PropertyType });
                    ilGenerator = setMethodBuilder.GetILGenerator(symbolDocumentWriter);
                    ilGenerator
                    .Ldarg(0)
                    .Ldfld(trFieldBuilder)
                    .Ldarg(0)
                    .Callvirt(() => ((IObjectDBTransactionInternal)null).CheckPropertyOperationValidity(null));
                    fieldHandlerCreateImpl.Generator = ilGenerator;
                    tableFieldInfo.Handler.CreatePropertySetter(fieldHandlerCreateImpl);
                    ilGenerator.Ret();
                    propertyBuilder.SetSetMethod(setMethodBuilder);
                }
                fieldHandlerCreateImpl.Generator = ilg;
                tableFieldInfo.Handler.CreateSaver(fieldHandlerCreateImpl);
            }
            ilg.Ldloc(1);
            ilg.Castclass(typeof(IDisposable));
            ilg.Callvirt(() => ((IDisposable)null).Dispose());
            ilg.Ret();
            Type result = tb.CreateType();

            //ab.Save(Name + "asm.dll");
            return(result);
        }