/// <inheritdoc /> public bool Execute() { try { if (!Directory.Exists(DestinationFolder)) { Directory.CreateDirectory(DestinationFolder); } AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += CurrentDomain_ReflectionOnlyAssemblyResolve; LoadDependentAssemblies(SourceAssemblyPath, GetIgnoreFiles()); //load target assembly var assembly = Assembly.ReflectionOnlyLoadFrom(SourceAssemblyPath); var types = GetTypesWithSqlTypeAttribute(assembly); var headerText = GetHeaderText(); foreach (var type in types) { var generatedType = SqlGenerator.GenerateUserType(type.UserType, type.SqlUserTypeAttributeData); var generatedSql = BuildSqlText(generatedType); var targetFile = Path.ChangeExtension(Path.Combine(DestinationFolder, GetSafeFilename(generatedType.TypeName)), "sql"); File.WriteAllText(targetFile, headerText + generatedSql, Encoding.UTF8); } return(true); } catch (ReflectionTypeLoadException exc) { var msg = FaultHelper.GetMessage(exc); BuildEngine.LogErrorEvent(FaultHelper.CreateErrorEvent(FaultHelper.AssemblyLoadError, SourceAssemblyPath, msg)); } catch (Exception exc) { var msg = FaultHelper.GetMessageCore(exc); BuildEngine.LogErrorEvent(FaultHelper.CreateErrorEvent(FaultHelper.GeneralError, SourceAssemblyPath, msg)); } return(false); }
private void LoadDependentAssemblies(string sourceAssemblyPath, HashSet <string> ignoredFiles) { //load all assemblies in project output folder to reflection-only context var directoryName = Path.GetDirectoryName(sourceAssemblyPath); var files = Directory.GetFiles(directoryName) .Where(f => StringHelper.IsEqualStrings(Path.GetExtension(f), ".dll")) .Where(x => !ignoredFiles.Contains(Path.GetFileName(x))); foreach (var file in files) { try { Assembly.ReflectionOnlyLoadFrom(file); } // ignore native dll loading errors catch (BadImageFormatException exc) { var msg = FaultHelper.GetMessageCore(exc); BuildEngine.LogErrorEvent(FaultHelper.CreateErrorEvent(FaultHelper.AssemblyLoadError, file, msg)); } } }