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); }
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 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); }
protected void CreateOutputDirectory(GeneratorProjectInfo projectInfo) { Directory.CreateDirectory(projectInfo.Out); }
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); }
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; }
public bool TryGetProjectInfo(string[] args, out GeneratorProjectInfo projectInfo) { projectInfo = CommandLineManager.Parse(args); return(projectInfo != null); }
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; }