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); }
public void CreateSaver(FieldHandlerCreateImpl ctx) { ctx.Generator .Ldloc(1) .Ldloc(0) .Ldfld(ctx.DefaultFieldBuilder) .Call(typeof(ListDBObjectFieldHandler).GetMethod("SaverImpl").MakeGenericMethod(ctx.DefaultFieldBuilder.FieldType.GetGenericArguments())); }
public void CreateSaver(FieldHandlerCreateImpl ctx) { ctx.Generator .Ldloc(1) .Ldloc(0) .Ldfld(ctx.DefaultFieldBuilder) .Call(() => ((AbstractBufferedWriter)null).WriteVUInt64(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); }); }
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); } }
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); }
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; }
public void CreateStorage(FieldHandlerCreateImpl ctx) { ctx.CreateSimpleStorage(typeof(ulong)); }
public void CreateStorage(FieldHandlerCreateImpl ctx) { ctx.CreateSimpleStorage(); }
public void CreatePropertySetter(FieldHandlerCreateImpl ctx) { ctx.CreateSimplePropertySetter(); }
public void CreatePropertySetter(FieldHandlerCreateImpl ctx) { throw new BTDBException(string.Format("Property {0} in {1} must be read only", ctx.FieldName, ctx.TableName)); }
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); }