Example #1
0
        protected TimeSpan RunInternal(AssemblyDefinition assembly, GeneratorProjectInfo projectInfo, ProjectGenerationSettings settings)
        {
            OnProjectGenerationStarted(assembly);

            string projFilePath = Path.Combine(projectInfo.Out, Path.GetFileNameWithoutExtension(projectInfo.Target) + projectInfo.Language.VSProjectFileExtension + (settings.JustDecompileSupportedProjectType ? string.Empty : MSBuildProjectBuilder.ErrorFileExtension));

            DecompilationPreferences preferences = new DecompilationPreferences();

            preferences.WriteFullNames              = false;
            preferences.WriteDocumentation          = projectInfo.AddDocumentation;
            preferences.RenameInvalidMembers        = projectInfo.RenameInvalidMembers;
            preferences.WriteLargeNumbersInHex      = projectInfo.WriteLargeNumbersInHex;
            preferences.DecompileDangerousResources = projectInfo.DecompileDangerousResources;

            IFrameworkResolver      frameworkResolver      = new ConsoleFrameworkResolver(projectInfo.FrameworkVersion);
            ITargetPlatformResolver targetPlatformResolver = TargetPlatformResolver.Instance;

            BaseProjectBuilder projectBuilder = GetProjectBuilder(assembly, projectInfo, settings, projectInfo.Language, projFilePath, preferences, frameworkResolver, targetPlatformResolver);

            AttachProjectBuilderEventHandlers(projectBuilder);

            //As per https://github.com/telerik/JustDecompileEngine/pull/2
            DateTime startTime = DateTime.UtcNow;

            projectBuilder.BuildProject();
            TimeSpan projectGenerationTime = DateTime.UtcNow - startTime;

            DetachProjectBuilderEventHandlers(projectBuilder);

            return(projectGenerationTime);
        }
 public override void Run(GeneratorProjectInfo projectInfo)
 {
     AssemblyDefinition assembly = Telerik.JustDecompiler.Decompiler.Utilities.GetAssembly(projectInfo.Target);
     ProjectGenerationSettings settings = base.GetSettings(projectInfo);
     base.CreateOutputDirectory(projectInfo);
     base.RunInternal(assembly, projectInfo, settings);
 }
Example #3
0
        public override void Run(GeneratorProjectInfo projectInfo)
        {
            AssemblyDefinition        assembly = Telerik.JustDecompiler.Decompiler.Utilities.GetAssembly(projectInfo.Target);
            ProjectGenerationSettings settings = base.GetSettings(projectInfo);

            base.CreateOutputDirectory(projectInfo);
            base.RunInternal(assembly, projectInfo, settings);
        }
        private MSBuildProjectBuilder GetProjectBuilder(AssemblyDefinition assembly, GeneratorProjectInfo projectInfo, ProjectGenerationSettings settings, ILanguage language, string projFilePath, DecompilationPreferences preferences, IFrameworkResolver frameworkResolver)
        {
            TargetPlatform targetPlatform = assembly.MainModule.AssemblyResolver.GetTargetPlatform(assembly.MainModule.FilePath);

            if (targetPlatform == TargetPlatform.WinRT)
            {
                return(new WinRTProjectBuilder(projectInfo.Target, projFilePath, language, preferences, null, NoCacheAssemblyInfoService.Instance, projectInfo.VisualStudioVersion, settings));
            }
            else
            {
                return(new MSBuildProjectBuilder(projectInfo.Target, projFilePath, language, frameworkResolver, preferences, null, NoCacheAssemblyInfoService.Instance, projectInfo.VisualStudioVersion, settings));
            }
        }
Example #5
0
        protected TimeSpan RunInternal(AssemblyDefinition assembly, GeneratorProjectInfo projectInfo, ProjectGenerationSettings settings)
        {
            string projFilePath = Path.Combine(projectInfo.Out, Path.GetFileNameWithoutExtension(projectInfo.Target) + projectInfo.Language.VSProjectFileExtension + (settings.JustDecompileSupportedProjectType ? string.Empty : MSBuildProjectBuilder.ErrorFileExtension));

            DecompilationPreferences preferences = new DecompilationPreferences();

            preferences.WriteFullNames       = false;
            preferences.WriteDocumentation   = projectInfo.AddDocumentation;
            preferences.RenameInvalidMembers = projectInfo.RenameInvalidMembers;

            IFrameworkResolver    frameworkResolver = new ConsoleFrameworkResolver(projectInfo.FrameworkVersion);
            MSBuildProjectBuilder projectBuilder    = GetProjectBuilder(assembly, projectInfo, settings, projectInfo.Language, projFilePath, preferences, frameworkResolver);

            ConfigurateProjectBuilder(projectBuilder);

            DateTime startTime = DateTime.Now;

            projectBuilder.BuildProject();
            TimeSpan projectGenerationTime = DateTime.Now - startTime;

            return(projectGenerationTime);
        }
Example #6
0
 protected void CreateOutputDirectory(GeneratorProjectInfo projectInfo)
 {
     Directory.CreateDirectory(projectInfo.Out);
 }
Example #7
0
 protected ProjectGenerationSettings GetSettings(GeneratorProjectInfo projectInfo)
 {
     return(ProjectGenerationSettingsProvider.GetProjectGenerationSettings(projectInfo.Target, NoCacheAssemblyInfoService.Instance,
                                                                           new ConsoleFrameworkResolver(projectInfo.FrameworkVersion), projectInfo.VisualStudioVersion, projectInfo.Language, TargetPlatformResolver.Instance));
 }
        internal static GeneratorProjectInfo Parse(string[] args)
        {
            int numberOfFoundValidArguments = 0;

            bool   isOutParamPresented    = false;
            string outParam               = string.Empty;
            bool   isTargetParamPresented = false;
            string targetParam            = string.Empty;

            bool      isInvalidLanguage = false;
            ILanguage languageParam     = null;

            bool?addDocumentation       = null;
            bool?renameInvalidMembers   = null;
            bool?writeLargeNumbersInHex = null;

            bool isInvalidVisualStudioVersion       = false;
            VisualStudioVersion visualStudioVersion = VisualStudioVersion.Unknown;

            int numberOfFrameworkVersionArguments = 0;
            FrameworkVersion frameworkVersion     = FrameworkVersion.Unknown;

            bool isProjectGenerationRequested = false;

            if (args.Length == 0)
            {
                return(null);
            }

            if (TryGetHelpText(args))
            {
                return(new GeneratorProjectInfo(new CommandLineHelpError()));
            }

            if (TryGetOutParam(args, out outParam))
            {
                isOutParamPresented          = true;
                isProjectGenerationRequested = true;
                numberOfFoundValidArguments++;
            }

            if (TryGetTargetParam(args, out targetParam))
            {
                isTargetParamPresented       = true;
                isProjectGenerationRequested = true;
                numberOfFoundValidArguments++;
            }

            if (TryGetLanguageParam(args, out languageParam, ref isInvalidLanguage))
            {
                isProjectGenerationRequested = true;
                numberOfFoundValidArguments++;
            }

            if (TryGetNodocArgument(args))
            {
                addDocumentation             = false;
                isProjectGenerationRequested = true;
                numberOfFoundValidArguments++;
            }

            if (TryGetNoRenameArgument(args))
            {
                renameInvalidMembers         = false;
                isProjectGenerationRequested = true;
                numberOfFoundValidArguments++;
            }

            if (TryGetNoHexArgument(args))
            {
                writeLargeNumbersInHex       = false;
                isProjectGenerationRequested = true;
                numberOfFoundValidArguments++;
            }

            if (TryGetVisualStudioVersionParam(args, out visualStudioVersion, ref isInvalidVisualStudioVersion))
            {
                isProjectGenerationRequested = true;
                numberOfFoundValidArguments++;
            }

            foreach (KeyValuePair <string, FrameworkVersion> pair in FrameworkVersions)
            {
                if (TryGetFrameworkVersion(args, pair.Key))
                {
                    frameworkVersion = pair.Value;
                    numberOfFrameworkVersionArguments++;
                    isProjectGenerationRequested = true;
                    numberOfFoundValidArguments++;
                }
            }

            if (!isProjectGenerationRequested)
            {
                return(null);
            }

            if (!isOutParamPresented || string.IsNullOrWhiteSpace(outParam))
            {
                return(new GeneratorProjectInfo(new CommandLineError(string.Format(RequiredParameterErrorPattern, "out"))));
            }

            if (!isTargetParamPresented || string.IsNullOrWhiteSpace(targetParam))
            {
                return(new GeneratorProjectInfo(new CommandLineError(string.Format(RequiredParameterErrorPattern, "target"))));
            }
            else if (!IsValidFilePath(targetParam))
            {
                return(new GeneratorProjectInfo(new CommandLineError(InvalidAssemblyPathError)));
            }

            if (isInvalidVisualStudioVersion)
            {
                return(new GeneratorProjectInfo(new CommandLineError(InvalidVisualStudioVersionError)));
            }

            if (numberOfFrameworkVersionArguments > 1)
            {
                return(new GeneratorProjectInfo(new CommandLineError(MultipleFrameworkVersionsError)));
            }

            if (isInvalidLanguage)
            {
                return(new GeneratorProjectInfo(new CommandLineError(string.Format("{0} {1}", InvalidLanguageError, SupportedLanguagesMessage))));
            }

            // The following check is disabled because it is valid with this type of parameters: /target:SomeAssembly.dll.
            // Until now the help message wasn't written very good and it doesn't point out clearly that out and target
            // parameters must be followed by : and then the path to the assembly, and some users may used it with this type
            // of parameters: /target SomeAssembly.dll, which we parse correctly. If we add it now it would be braking change.
            // Consider to enable it after some amount of time, an year or two.
            //if (numberOfFoundValidArguments != args.Length)
            //{
            //    return new GeneratorProjectInfo(new CommandLineError(string.Format("{0} {1}", UnsupportedParametersPresentedError, UseQuotesHintMessage)));
            //}

            GeneratorProjectInfo result = new GeneratorProjectInfo(targetParam, outParam.EndsWith("\\") ? outParam : outParam + "\\");

            if (languageParam != null)
            {
                result.Language = languageParam;
            }

            if (addDocumentation.HasValue)
            {
                result.AddDocumentation = addDocumentation.Value;
            }

            if (renameInvalidMembers.HasValue)
            {
                result.RenameInvalidMembers = renameInvalidMembers.Value;
            }

            // This if statement must be after the if statement setting the language, because otherwise the value would be lost.
            if (writeLargeNumbersInHex.HasValue)
            {
                result.Language.WriteLargeNumbersInHex = writeLargeNumbersInHex.Value;
            }

            if (visualStudioVersion != VisualStudioVersion.Unknown)
            {
                result.VisualStudioVersion = visualStudioVersion;
            }

            if (frameworkVersion != FrameworkVersion.Unknown)
            {
                result.FrameworkVersion = frameworkVersion;
            }

            return(result);
        }
        public virtual void Run(GeneratorProjectInfo projectInfo)
        {
            //"lang:scharp",
            //@"/target C:\Work\Behemoth\Trunk\Source\Binaries\Telerik.Windows.Controls.dll",
            //string[] testArgs = new string[] {"/target" @"C:\Work\Behemoth\Trunk\Source\Binaries\Telerik.Windows.Controls.dll", @"/out", "c:\\dir" };

            #if ENGINEONLYBUILD
            if (projectInfo == null)
            {
                projectInfo = new GeneratorProjectInfo(new CommandLineHelpError());
            }
            #endif

            if (projectInfo == null)
            {
                CommandLineManager.WriteLineColor(ConsoleColor.Red, "args = null");
                CommandLineManager.ResetColor();

                return;
            }

            try
            {
                // If there is an error, there is no need to create output directory, because there will not be any project generation at all.
                if (projectInfo.Error == null)
                {
                    try
                    {
                        this.CreateOutputDirectory(projectInfo);
                    }
                    catch (Exception ex)
                    {
                        if (ex is IOException || ex is UnauthorizedAccessException || ex is ArgumentException ||
                            ex is PathTooLongException || ex is DirectoryNotFoundException || ex is NotSupportedException)
                        {
                            projectInfo.Error = new CommandLineError(CommandLineManager.InvalidDirectoryPathError + ex.Message);
                        }
                        else
                        {
                            throw;
                        }
                    }
                }

                if (projectInfo.Error == null)
                {
                    CommandLineManager.WriteLine();

                    CommandLineManager.WriteLineColor(ConsoleColor.White, description);
                    CommandLineManager.WriteLineColor(ConsoleColor.White, new string(Enumerable.Range(0, description.Length).Select(i => '=').ToArray()));
                    Console.WriteLine();
                    Console.WriteLine("Generates MS Visual Studio(r) Project from .NET assembly.");
                    CommandLineManager.WriteLine();

                    if (!CLRHelper.IsValidClrFile(projectInfo.Target))
                    {
                        CommandLineManager.WriteLineColor(ConsoleColor.Red, "The target assembly is not a valid CLR assembly.");
                        return;
                    }

                    AssemblyDefinition assembly = Telerik.JustDecompiler.Decompiler.Utilities.GetAssembly(projectInfo.Target);
                    ProjectGenerationSettings settings = this.GetSettings(projectInfo);
                    if (!settings.VisualStudioSupportedProjectType)
                    {
                        CommandLineManager.WriteLineColor(ConsoleColor.Red, this.ReplaceRegisteredTrademarkSymbol(settings.ErrorMessage));
                        return;
                    }
                    else if (!settings.JustDecompileSupportedProjectType)
                    {
                        CommandLineManager.WriteLineColor(ConsoleColor.Yellow, this.ReplaceRegisteredTrademarkSymbol(settings.ErrorMessage));
                        CommandLineManager.WriteLine();
                    }
                    else if (!projectInfo.IsDefaultFrameworkVersion)
                    {
                        AssemblyInfo assemblyInfo = NoCacheAssemblyInfoService.Instance.GetAssemblyInfo(assembly, new ConsoleFrameworkResolver(projectInfo.FrameworkVersion));
                        if (assemblyInfo.ModulesFrameworkVersions[assembly.MainModule] != projectInfo.FrameworkVersion)
                        {
                            CommandLineManager.WriteLineColor(ConsoleColor.Yellow, "JustDecompile managed to determine the target assembly framework. The fallback target framework version command line option is ignored.");
                            CommandLineManager.WriteLine();
                        }
                    }

                    CommandLineManager.WriteLineColor(ConsoleColor.White, "Project Creation:");
                    CommandLineManager.WriteLineColor(ConsoleColor.White, "============================");

                    TimeSpan projectGenerationTime = RunInternal(assembly, projectInfo, settings);

                    CommandLineManager.WriteLine();
                    CommandLineManager.WriteLineColor(ConsoleColor.White, "============================");
                    CommandLineManager.WriteLineColor(ConsoleColor.White, string.Format("Finished in {0:0.0} seconds.", projectGenerationTime.TotalSeconds));

                    count = 0;
                }
                else
                {
                    projectInfo.Error.PrintError();
                }
            }
            catch (Exception ex)
            {
                CommandLineManager.WriteLine();
                CommandLineManager.WriteLineColor(ConsoleColor.Red, ex.Message);
            }
            finally
            {
                CommandLineManager.WriteLine();
                CommandLineManager.ResetColor();
            }
        }
 private MSBuildProjectBuilder GetProjectBuilder(AssemblyDefinition assembly, GeneratorProjectInfo projectInfo, ProjectGenerationSettings settings, ILanguage language, string projFilePath, DecompilationPreferences preferences, IFrameworkResolver frameworkResolver)
 {
     TargetPlatform targetPlatform = assembly.MainModule.AssemblyResolver.GetTargetPlatform(assembly.MainModule.FilePath);
     if (targetPlatform == TargetPlatform.WinRT)
     {
         return new WinRTProjectBuilder(projectInfo.Target, projFilePath, language, preferences, null, NoCacheAssemblyInfoService.Instance, projectInfo.VisualStudioVersion, settings);
     }
     else
     {
         return new MSBuildProjectBuilder(projectInfo.Target, projFilePath, language, frameworkResolver, preferences, null, NoCacheAssemblyInfoService.Instance, projectInfo.VisualStudioVersion, settings);
     }
 }
 protected ProjectGenerationSettings GetSettings(GeneratorProjectInfo projectInfo)
 {
     return ProjectGenerationSettingsProvider.GetProjectGenerationSettings(projectInfo.Target, NoCacheAssemblyInfoService.Instance,
         new ConsoleFrameworkResolver(projectInfo.FrameworkVersion), projectInfo.VisualStudioVersion, projectInfo.Language);
 }
 protected void CreateOutputDirectory(GeneratorProjectInfo projectInfo)
 {
     Directory.CreateDirectory(projectInfo.Out);
 }
        public bool TryGetProjectInfo(string[] args, out GeneratorProjectInfo projectInfo)
        {
            projectInfo = CommandLineManager.Parse(args);

            return projectInfo != null;
        }
        internal static GeneratorProjectInfo Parse(string[] args)
        {
            int numberOfFoundValidArguments = 0;

            bool isOutParamPresented = false;
            string outParam = string.Empty;
            bool isTargetParamPresented = false;
            string targetParam = string.Empty;

            bool isInvalidLanguage = false;
            ILanguage languageParam = null;

            bool? addDocumentation = null;
            bool? renameInvalidMembers = null;
            bool? writeLargeNumbersInHex = null;

            bool isInvalidVisualStudioVersion = false;
            VisualStudioVersion visualStudioVersion = VisualStudioVersion.Unknown;

            int numberOfFrameworkVersionArguments = 0;
            FrameworkVersion frameworkVersion = FrameworkVersion.Unknown;

            bool isProjectGenerationRequested = false;

            if (args.Length == 0)
            {
                return null;
            }

            if (TryGetHelpText(args))
            {
                return new GeneratorProjectInfo(new CommandLineHelpError());
            }

            if (TryGetOutParam(args, out outParam))
            {
                isOutParamPresented = true;
                isProjectGenerationRequested = true;
                numberOfFoundValidArguments++;
            }

            if (TryGetTargetParam(args, out targetParam))
            {
                isTargetParamPresented = true;
                isProjectGenerationRequested = true;
                numberOfFoundValidArguments++;
            }

            if (TryGetLanguageParam(args, out languageParam, ref isInvalidLanguage))
            {
                isProjectGenerationRequested = true;
                numberOfFoundValidArguments++;
            }

            if (TryGetNodocArgument(args))
            {
                addDocumentation = false;
                isProjectGenerationRequested = true;
                numberOfFoundValidArguments++;
            }

            if (TryGetNoRenameArgument(args))
            {
                renameInvalidMembers = false;
                isProjectGenerationRequested = true;
                numberOfFoundValidArguments++;
            }

            if (TryGetNoHexArgument(args))
            {
                writeLargeNumbersInHex = false;
                isProjectGenerationRequested = true;
                numberOfFoundValidArguments++;
            }

            if (TryGetVisualStudioVersionParam(args, out visualStudioVersion, ref isInvalidVisualStudioVersion))
            {
                isProjectGenerationRequested = true;
                numberOfFoundValidArguments++;
            }

            foreach (KeyValuePair<string, FrameworkVersion> pair in FrameworkVersions)
            {
                if (TryGetFrameworkVersion(args, pair.Key))
                {
                    frameworkVersion = pair.Value;
                    numberOfFrameworkVersionArguments++;
                    isProjectGenerationRequested = true;
                    numberOfFoundValidArguments++;
                }
            }

            if (!isProjectGenerationRequested)
            {
                return null;
            }

            if (!isOutParamPresented || string.IsNullOrWhiteSpace(outParam))
            {
                return new GeneratorProjectInfo(new CommandLineError(string.Format(RequiredParameterErrorPattern, "out")));
            }

            if (!isTargetParamPresented || string.IsNullOrWhiteSpace(targetParam))
            {
                return new GeneratorProjectInfo(new CommandLineError(string.Format(RequiredParameterErrorPattern, "target")));
            }
            else if (!IsValidFilePath(targetParam))
            {
                return new GeneratorProjectInfo(new CommandLineError(InvalidAssemblyPathError));
            }

            if (isInvalidVisualStudioVersion)
            {
                return new GeneratorProjectInfo(new CommandLineError(InvalidVisualStudioVersionError));
            }

            if (numberOfFrameworkVersionArguments > 1)
            {
                return new GeneratorProjectInfo(new CommandLineError(MultipleFrameworkVersionsError));
            }

            if (isInvalidLanguage)
            {
                return new GeneratorProjectInfo(new CommandLineError(string.Format("{0} {1}", InvalidLanguageError, SupportedLanguagesMessage)));
            }

            // The following check is disabled because it is valid with this type of parameters: /target:SomeAssembly.dll.
            // Until now the help message wasn't written very good and it doesn't point out clearly that out and target
            // parameters must be followed by : and then the path to the assembly, and some users may used it with this type
            // of parameters: /target SomeAssembly.dll, which we parse correctly. If we add it now it would be braking change.
            // Consider to enable it after some amount of time, an year or two.
            //if (numberOfFoundValidArguments != args.Length)
            //{
            //    return new GeneratorProjectInfo(new CommandLineError(string.Format("{0} {1}", UnsupportedParametersPresentedError, UseQuotesHintMessage)));
            //}

            GeneratorProjectInfo result = new GeneratorProjectInfo(targetParam, outParam.EndsWith("\\") ? outParam : outParam + "\\");

            if (languageParam != null)
            {
                result.Language = languageParam;
            }

            if (addDocumentation.HasValue)
            {
                result.AddDocumentation = addDocumentation.Value;
            }

            if (renameInvalidMembers.HasValue)
            {
                result.RenameInvalidMembers = renameInvalidMembers.Value;
            }

            // This if statement must be after the if statement setting the language, because otherwise the value would be lost.
            if (writeLargeNumbersInHex.HasValue)
            {
                result.Language.WriteLargeNumbersInHex = writeLargeNumbersInHex.Value;
            }

            if (visualStudioVersion != VisualStudioVersion.Unknown)
            {
                result.VisualStudioVersion = visualStudioVersion;
            }

            if (frameworkVersion != FrameworkVersion.Unknown)
            {
                result.FrameworkVersion = frameworkVersion;
            }

            return result;
        }
Example #15
0
        public bool TryGetProjectInfo(string[] args, out GeneratorProjectInfo projectInfo)
        {
            projectInfo = CommandLineManager.Parse(args);

            return(projectInfo != null);
        }
Example #16
0
        public virtual void Run(GeneratorProjectInfo projectInfo)
        {
            //"lang:scharp",
            //@"/target C:\Work\Behemoth\Trunk\Source\Binaries\Telerik.Windows.Controls.dll",
            //string[] testArgs = new string[] {"/target" @"C:\Work\Behemoth\Trunk\Source\Binaries\Telerik.Windows.Controls.dll", @"/out", "c:\\dir" };

#if ENGINEONLYBUILD
            if (projectInfo == null)
            {
                projectInfo = new GeneratorProjectInfo(new CommandLineHelpError());
            }
#endif

            if (projectInfo == null)
            {
                CommandLineManager.WriteLineColor(ConsoleColor.Red, "args = null");
                CommandLineManager.ResetColor();

                return;
            }

            try
            {
                // If there is an error, there is no need to create output directory, because there will not be any project generation at all.
                if (projectInfo.Error == null)
                {
                    try
                    {
                        this.CreateOutputDirectory(projectInfo);
                    }
                    catch (Exception ex)
                    {
                        if (ex is IOException || ex is UnauthorizedAccessException || ex is ArgumentException ||
                            ex is PathTooLongException || ex is DirectoryNotFoundException || ex is NotSupportedException)
                        {
                            projectInfo.Error = new CommandLineError(CommandLineManager.InvalidDirectoryPathError + ex.Message);
                        }
                        else
                        {
                            throw;
                        }
                    }
                }

                if (projectInfo.Error == null)
                {
                    CommandLineManager.WriteLine();

                    CommandLineManager.WriteLineColor(ConsoleColor.White, description);
                    CommandLineManager.WriteLineColor(ConsoleColor.White, new string(Enumerable.Range(0, description.Length).Select(i => '=').ToArray()));
                    Console.WriteLine();
                    Console.WriteLine("Generates MS Visual Studio(r) Project from .NET assembly.");
                    CommandLineManager.WriteLine();

                    if (!CLRHelper.IsValidClrFile(projectInfo.Target))
                    {
                        CommandLineManager.WriteLineColor(ConsoleColor.Red, "The target assembly is not a valid CLR assembly.");
                        return;
                    }

                    AssemblyDefinition        assembly = Telerik.JustDecompiler.Decompiler.Utilities.GetAssembly(projectInfo.Target);
                    ProjectGenerationSettings settings = this.GetSettings(projectInfo);
                    if (!settings.VisualStudioSupportedProjectType)
                    {
                        CommandLineManager.WriteLineColor(ConsoleColor.Red, this.ReplaceRegisteredTrademarkSymbol(settings.ErrorMessage));
                        return;
                    }
                    else if (!settings.JustDecompileSupportedProjectType)
                    {
                        CommandLineManager.WriteLineColor(ConsoleColor.Yellow, this.ReplaceRegisteredTrademarkSymbol(settings.ErrorMessage));
                        CommandLineManager.WriteLine();
                    }
                    else if (!projectInfo.IsDefaultFrameworkVersion)
                    {
                        AssemblyInfo assemblyInfo = NoCacheAssemblyInfoService.Instance.GetAssemblyInfo(assembly, new ConsoleFrameworkResolver(projectInfo.FrameworkVersion));
                        if (assemblyInfo.ModulesFrameworkVersions[assembly.MainModule] != projectInfo.FrameworkVersion)
                        {
                            CommandLineManager.WriteLineColor(ConsoleColor.Yellow, "JustDecompile managed to determine the target assembly framework. The fallback target framework version command line option is ignored.");
                            CommandLineManager.WriteLine();
                        }
                    }

                    if (!projectInfo.DecompileDangerousResources)
                    {
                        CommandLineManager.WriteLineColor(ConsoleColor.Yellow, "By default JustDecompile's command-line project generataion does not decompile dangerous resources, which may contain malicious code. Decompilation of such resources will result in execution of that malicious code. Check the help [/?] for information how to turn on decompilation of such resources. WARNING: Use with trusted assemblies only.");
                        CommandLineManager.WriteLine();
                    }

                    CommandLineManager.WriteLineColor(ConsoleColor.White, "Project Creation:");
                    CommandLineManager.WriteLineColor(ConsoleColor.White, "============================");

                    TimeSpan projectGenerationTime = RunInternal(assembly, projectInfo, settings);

                    CommandLineManager.WriteLine();
                    CommandLineManager.WriteLineColor(ConsoleColor.White, "============================");
                    CommandLineManager.WriteLineColor(ConsoleColor.White, string.Format("Finished in {0:0.0} seconds.", projectGenerationTime.TotalSeconds));

                    count = 0;
                }
                else
                {
                    projectInfo.Error.PrintError();
                }
            }
            catch (Exception ex)
            {
                CommandLineManager.WriteLine();
                CommandLineManager.WriteLineColor(ConsoleColor.Red, ex.Message);

                OnExceptionThrown(ex);
            }
            finally
            {
                CommandLineManager.WriteLine();
                CommandLineManager.ResetColor();
            }
        }
        protected TimeSpan RunInternal(AssemblyDefinition assembly, GeneratorProjectInfo projectInfo, ProjectGenerationSettings settings)
        {
            string projFilePath = Path.Combine(projectInfo.Out, Path.GetFileNameWithoutExtension(projectInfo.Target) + projectInfo.Language.VSProjectFileExtension + (settings.JustDecompileSupportedProjectType ? string.Empty : MSBuildProjectBuilder.ErrorFileExtension));

            DecompilationPreferences preferences = new DecompilationPreferences();
            preferences.WriteFullNames = false;
            preferences.WriteDocumentation = projectInfo.AddDocumentation;
            preferences.RenameInvalidMembers = projectInfo.RenameInvalidMembers;

            IFrameworkResolver frameworkResolver = new ConsoleFrameworkResolver(projectInfo.FrameworkVersion);
            MSBuildProjectBuilder projectBuilder = GetProjectBuilder(assembly, projectInfo, settings, projectInfo.Language, projFilePath, preferences, frameworkResolver);
            ConfigurateProjectBuilder(projectBuilder);

            //As per https://github.com/telerik/JustDecompileEngine/pull/2
            DateTime startTime = DateTime.UtcNow;
            projectBuilder.BuildProject();
            TimeSpan projectGenerationTime = DateTime.UtcNow - startTime;
            return projectGenerationTime;
        }