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