public void Execute(ExportToProjectVM vm) { vm.ProgressMinimum = 0; vm.ProgressMaximum = 1; vm.TotalProgress = 0; vm.IsIndeterminate = false; Task.Factory.StartNew(() => { var decompilationContext = new DecompilationContext { CancellationToken = cancellationToken, GetDisableAssemblyLoad = () => owner.documentTreeView.DocumentService.DisableAssemblyLoad(), }; var options = new ProjectCreatorOptions(vm.Directory, cancellationToken); options.ProjectVersion = vm.ProjectVersion; if (vm.CreateSolution) options.SolutionFilename = vm.SolutionFilename; options.Logger = this; options.ProgressListener = this; bool hasProjectGuid = vm.ProjectGuid.Value != null; string guidFormat = null; int guidNum = 0; if (hasProjectGuid) { string guidStr = vm.ProjectGuid.Value.ToString(); guidNum = int.Parse(guidStr.Substring(36 - 8, 8), NumberStyles.HexNumber); guidFormat = guidStr.Substring(0, 36 - 8) + "{0:X8}"; } foreach (var module in modules.OrderBy(a => a.Location, StringComparer.InvariantCultureIgnoreCase)) { var projOpts = new ProjectModuleOptions(module, vm.Decompiler, decompilationContext) { DontReferenceStdLib = vm.DontReferenceStdLib, UnpackResources = vm.UnpackResources, CreateResX = vm.CreateResX, DecompileXaml = vm.DecompileXaml, ProjectGuid = hasProjectGuid ? new Guid(string.Format(guidFormat, guidNum++)) : Guid.NewGuid(), }; if (bamlDecompiler != null) { var o = BamlDecompilerOptions.Create(vm.Decompiler); var outputOptions = xamlOutputOptionsProvider?.Default ?? new XamlOutputOptions(); projOpts.DecompileBaml = (a, b, c, d) => bamlDecompiler.Decompile(a, b, c, o, d, outputOptions); } options.ProjectModules.Add(projOpts); } var creator = new MSBuildProjectCreator(options); creator.Create(); if (vm.CreateSolution) fileToOpen = creator.SolutionFilename; else fileToOpen = creator.ProjectFilenames.FirstOrDefault(); }, cancellationToken) .ContinueWith(t => { var ex = t.Exception; if (ex != null) Error(string.Format(dnSpy_Resources.ErrorExceptionOccurred, ex)); EmtpyErrorList(); vm.OnExportComplete(); if (!vm.ExportErrors) { dlg.Close(); if (vm.OpenProject) OpenProject(); } }, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); }
public override void Execute(IMenuItemContext context) { var modules = GetModules(); if (modules.Length == 0) return; var decompiler = decompilerService.Decompiler; if (decompiler.ProjectFileExtension == null) { decompiler = decompilerService.AllDecompilers.FirstOrDefault(a => a.ProjectFileExtension != null); Debug.Assert(decompiler != null); if (decompiler == null) return; } var task = new ExportTask(this, modules); var vm = new ExportToProjectVM(new PickDirectory(), decompilerService, task, bamlDecompiler != null); task.vm = vm; vm.ProjectVersion = exportToProjectSettings.ProjectVersion; vm.CreateResX = documentTreeViewSettings.DeserializeResources; vm.DontReferenceStdLib = modules.Any(a => a.Assembly.IsCorLib()); vm.Decompiler = decompiler; vm.SolutionFilename = GetSolutionFilename(modules); vm.FilesToExportMessage = CreateFilesToExportMessage(modules); var win = new ExportToProjectDlg(); task.dlg = win; win.DataContext = vm; win.Owner = appWindow.MainWindow; using (documentTreeView.DocumentService.DisableAssemblyLoad()) win.ShowDialog(); if (vm.IsComplete) exportToProjectSettings.ProjectVersion = vm.ProjectVersion; task.Dispose(); }
public void Cancel(ExportToProjectVM vm) { cancellationTokenSource.Cancel(); dlg.Close(); }