public override Task <CreateProjectResponse> CreateProject(CreateProjectRequest request, ServerCallContext context) { if (string.IsNullOrEmpty(request.OutputPath) || string.IsNullOrEmpty(request.AssemblyFilePath)) { throw new RpcException(new Status(StatusCode.InvalidArgument, "Invalid argument")); } bool decompileDangerousResources = request.DecompileDangerousResources; VisualStudioVersion visualStudioVersion = this.GetProjectCreationVSVersion(request.ProjectVisualStudioVersion); ILanguage language = LanguageFactory.GetLanguage(CSharpVersion.V7); AssemblyDefinition assembly = GlobalAssemblyResolver.Instance.GetAssemblyDefinition(request.AssemblyFilePath); ProjectGenerationSettings settings = ProjectGenerationSettingsProvider.GetProjectGenerationSettings(request.AssemblyFilePath, NoCacheAssemblyInfoService.Instance, EmptyResolver.Instance, visualStudioVersion, language, TargetPlatformResolver.Instance); DecompilationPreferences preferences = new DecompilationPreferences() { WriteFullNames = false, WriteDocumentation = true, RenameInvalidMembers = true, WriteLargeNumbersInHex = false, DecompileDangerousResources = decompileDangerousResources }; BaseProjectBuilder projectBuilder = this.GetProjectBuilder(assembly, request.AssemblyFilePath, visualStudioVersion, settings, language, request.OutputPath, preferences, EmptyResolver.Instance, TargetPlatformResolver.Instance); string generationErrorMessage = this.CreateProject(projectBuilder); return(Task.FromResult(new CreateProjectResponse() { ErrorMessage = generationErrorMessage })); }
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); }
public override Task <GetProjectCreationMetadataResponse> GetProjectCreationMetadata(GetProjectCreationMetadataRequest request, ServerCallContext context) { VisualStudioVersion visualStudioVersion = this.GetProjectCreationVSVersion(request.ProjectVisualStudioVersion); AssemblyDefinition assemblyDefinition = GlobalAssemblyResolver.Instance.GetAssemblyDefinition(request.AssemblyFilePath); ILanguage language = LanguageFactory.GetLanguage(CSharpVersion.V7); ProjectGenerationSettings settings = ProjectGenerationSettingsProvider.GetProjectGenerationSettings(request.AssemblyFilePath, NoCacheAssemblyInfoService.Instance, EmptyResolver.Instance, visualStudioVersion, language, TargetPlatformResolver.Instance); bool containsDangerousResources = assemblyDefinition.Modules.SelectMany(m => m.Resources).Any(r => DangerousResourceIdentifier.IsDangerousResource(r)); string normalizedVSProjectFileExtension = language.VSProjectFileExtension.TrimStart('.'); string generatedProjectExtension = normalizedVSProjectFileExtension + (settings.JustDecompileSupportedProjectType ? string.Empty : MSBuildProjectBuilder.ErrorFileExtension); return(Task.FromResult(new GetProjectCreationMetadataResponse() { ContainsDangerousResources = containsDangerousResources, ProjectFileMetadata = new ProjectFileMetadata() { IsDecompilerSupportedProjectType = settings.JustDecompileSupportedProjectType, IsVSSupportedProjectType = settings.VisualStudioSupportedProjectType, ProjectTypeNotSupportedErrorMessage = settings.ErrorMessage ?? string.Empty, ProjectFileName = assemblyDefinition.Name.Name, ProjectFileExtension = generatedProjectExtension } })); }
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(); } }
private BaseProjectBuilder GetProjectBuilder(AssemblyDefinition assembly, GeneratorProjectInfo projectInfo, ProjectGenerationSettings settings, ILanguage language, string projFilePath, DecompilationPreferences preferences, IFrameworkResolver frameworkResolver, ITargetPlatformResolver targetPlatformResolver) { TargetPlatform targetPlatform = targetPlatformResolver.GetTargetPlatform(assembly.MainModule.FilePath, assembly.MainModule); BaseProjectBuilder projectBuilder = null; if (targetPlatform == TargetPlatform.NetCore) { projectBuilder = new NetCoreProjectBuilder(projectInfo.Target, projFilePath, language, preferences, null, NoCacheAssemblyInfoService.Instance, projectInfo.VisualStudioVersion, settings); } else if (targetPlatform == TargetPlatform.WinRT) { projectBuilder = new WinRTProjectBuilder(projectInfo.Target, projFilePath, language, preferences, null, NoCacheAssemblyInfoService.Instance, projectInfo.VisualStudioVersion, settings); } else { projectBuilder = new MSBuildProjectBuilder(projectInfo.Target, projFilePath, language, frameworkResolver, preferences, null, NoCacheAssemblyInfoService.Instance, projectInfo.VisualStudioVersion, settings); } return(projectBuilder); }
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 NetCoreProjectBuilder(string assemblyPath, string targetPath, ILanguage language, IDecompilationPreferences preferences, IFileGenerationNotifier notifier, IAssemblyInfoService assemblyInfoService, VisualStudioVersion visualStudioVersion = VisualStudioVersion.VS2017, ProjectGenerationSettings projectGenerationSettings = null, IProjectGenerationNotifier projectNotifier = null) : base(assemblyPath, targetPath, language, null, preferences, notifier, assemblyInfoService, visualStudioVersion, projectGenerationSettings, projectNotifier) { this.projectFileManager = new NetCoreProjectFileManager(this.assembly, this.assemblyInfo, this.modulesProjectsGuids); }
public NetCoreProjectBuilder(string assemblyPath, AssemblyDefinition assembly, Dictionary <ModuleDefinition, Mono.Collections.Generic.Collection <TypeDefinition> > userDefinedTypes, Dictionary <ModuleDefinition, Mono.Collections.Generic.Collection <Resource> > resources, string targetPath, ILanguage language, IDecompilationPreferences preferences, IAssemblyInfoService assemblyInfoService, VisualStudioVersion visualStudioVersion = VisualStudioVersion.VS2017, ProjectGenerationSettings projectGenerationSettings = null, IProjectGenerationNotifier projectNotifier = null) : base(assemblyPath, assembly, userDefinedTypes, resources, targetPath, language, null, preferences, assemblyInfoService, visualStudioVersion, projectGenerationSettings, projectNotifier) { this.projectFileManager = new NetCoreProjectFileManager(this.assembly, this.assemblyInfo, this.modulesProjectsGuids); }
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); }