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