private static Assembly BuildAssembly(TypeDescriptorProvider typeDescriptorProvider, DataAccessModelConfiguration configuration) { DataAccessObjectTypeBuilder dataAccessObjectTypeBuilder; var hash = configuration.GetSha1(); var assemblyName = new AssemblyName(typeDescriptorProvider.DataAccessModelType.Assembly.GetName().Name + "." + typeDescriptorProvider.DataAccessModelType.Name); var sharedAssemblyName = new AssemblyName("Shaolinq.GeneratedDataAccessModel"); var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(sharedAssemblyName, AssemblyBuilderAccess.RunAndSave); var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, assemblyName.Name + "." + hash + ".dll"); var propertiesBuilder = moduleBuilder.DefineType("$$$DataAccessModelProperties", TypeAttributes.Class, typeof(object)); var assemblyBuildContext = new AssemblyBuildContext(assemblyBuilder, propertiesBuilder); var dataAccessModelTypeBuilder = new DataAccessModelTypeBuilder(assemblyBuildContext, moduleBuilder); dataAccessModelTypeBuilder.BuildTypePhase1(typeDescriptorProvider.DataAccessModelType); var typeDescriptors = typeDescriptorProvider.GetTypeDescriptors(); foreach (var typeDescriptor in typeDescriptors) { dataAccessObjectTypeBuilder = new DataAccessObjectTypeBuilder(typeDescriptorProvider, assemblyBuildContext, moduleBuilder, typeDescriptor.Type); dataAccessObjectTypeBuilder.Build(new DataAccessObjectTypeBuilder.TypeBuildContext(1)); } foreach (var typeDescriptor in typeDescriptors) { dataAccessObjectTypeBuilder = assemblyBuildContext.TypeBuilders[typeDescriptor.Type]; dataAccessObjectTypeBuilder.Build(new DataAccessObjectTypeBuilder.TypeBuildContext(2)); } assemblyBuildContext.DataAccessModelPropertiesTypeBuilder.CreateType(); dataAccessModelTypeBuilder.BuildTypePhase2(); bool saveConcreteAssembly; bool.TryParse(ConfigurationManager.AppSettings["Shaolinq.SaveConcreteAssembly"], out saveConcreteAssembly); #if DEBUG const bool isInDebugMode = true; #else const bool isInDebugMode = false; #endif // ReSharper disable once ConditionIsAlwaysTrueOrFalse if (saveConcreteAssembly || isInDebugMode) { ActionUtils.IgnoreExceptions(() => assemblyBuilder.Save(assemblyName + "." + hash + ".dll")); } return assemblyBuilder; }
private static Assembly BuildAssembly(TypeDescriptorProvider typeDescriptorProvider, DataAccessModelConfiguration configuration) { DataAccessObjectTypeBuilder dataAccessObjectTypeBuilder; var configMd5 = configuration.GetMd5(); var assemblyName = new AssemblyName(typeDescriptorProvider.DataAccessModelType.Assembly.GetName().Name + "." + typeDescriptorProvider.DataAccessModelType.Name); var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, assemblyName.Name + "." + configMd5 + ".dll"); var assemblyBuildContext = new AssemblyBuildContext(assemblyBuilder); var dataAccessModelTypeBuilder = new DataAccessModelTypeBuilder(assemblyBuildContext, moduleBuilder); dataAccessModelTypeBuilder.BuildType(typeDescriptorProvider.DataAccessModelType); var typeDescriptors = typeDescriptorProvider.GetTypeDescriptors(); foreach (var typeDescriptor in typeDescriptors) { dataAccessObjectTypeBuilder = new DataAccessObjectTypeBuilder(typeDescriptorProvider, assemblyBuildContext, moduleBuilder, typeDescriptor.Type); dataAccessObjectTypeBuilder.Build(new DataAccessObjectTypeBuilder.TypeBuildContext(1)); } foreach (var typeDescriptor in typeDescriptors) { dataAccessObjectTypeBuilder = assemblyBuildContext.TypeBuilders[typeDescriptor.Type]; dataAccessObjectTypeBuilder.Build(new DataAccessObjectTypeBuilder.TypeBuildContext(2)); } bool saveConcreteAssembly; bool.TryParse(ConfigurationManager.AppSettings["Shaolinq.SaveConcreteAssembly"], out saveConcreteAssembly); #if DEBUG const bool isInDebugMode = true; #else const bool isInDebugMode = false; #endif if (saveConcreteAssembly || isInDebugMode) { ActionUtils.IgnoreExceptions(() => assemblyBuilder.Save(assemblyName + "." + configMd5 + ".dll")); } return assemblyBuilder; }