public void Perform()

in ILRepack/Steps/ResourcesRepackStep.cs [47:153]


        public void Perform()
        {
            _logger.Info("Processing resources");

            // merge resources
            IEnumerable<string> repackList = new List<string>();
            Dictionary<string, List<int>> ikvmExportsLists = new Dictionary<string, List<int>>();
            if (!_options.NoRepackRes)
            {
                repackList = _repackContext.MergedAssemblies.Select(a => a.FullName).ToList();
            }

            bool areCollectedStreamsWritten = false;
            var bamlStreamCollector = new BamlStreamCollector(_logger, _repackContext);
            var bamlResourcePatcher = new BamlResourcePatcher(_repackContext);
            var commonProcessors = new List<IResProcessor>
            {
                new StringResourceProcessor(_repackContext),
                new GenericResourceProcessor(_repackContext)
            };

            var primaryAssemblyProcessors =
                new[] { bamlResourcePatcher }.Union(commonProcessors).ToList();
            var otherAssemblyProcessors =
                new List<IResProcessor> { bamlResourcePatcher, bamlStreamCollector }.Union(commonProcessors).ToList();

            // Primary Assembly *must* be the last one in order to properly gather the resources
            // from dependencies
            var assembliesList = _repackContext.OtherAssemblies.Concat(new[] { _repackContext.PrimaryAssemblyDefinition });
            foreach (var assembly in assembliesList)
            {
                bool isPrimaryAssembly = assembly == _repackContext.PrimaryAssemblyDefinition;
                var assemblyProcessors = isPrimaryAssembly ? primaryAssemblyProcessors : otherAssemblyProcessors;

                foreach (var resource in assembly.Modules.SelectMany(x => x.Resources))
                {
                    if (resource.Name == ILRepackListResourceName)
                    {
                        if (!_options.NoRepackRes && resource is EmbeddedResource)
                        {
                            repackList = repackList.Union(GetRepackListFromResource((EmbeddedResource)resource));
                        }
                    }
                    else if (resource.Name == "ikvm.exports")
                    {
                        if (resource is EmbeddedResource)
                        {
                            ikvmExportsLists = MergeIkvmExports(
                                ikvmExportsLists,
                                GetIkvmExportsListsFromResource((EmbeddedResource)resource));
                        }
                    }
                    else
                    {
                        if (!_options.AllowDuplicateResources && _targetAssemblyMainModule.Resources.Any(x => x.Name == resource.Name))
                        {
                            // Not much we can do about 'ikvm__META-INF!MANIFEST.MF'
                            _logger.Warn("Ignoring duplicate resource " + resource.Name);
                        }
                        else
                        {
                            _logger.Verbose("- Importing " + resource.Name);
                            var newResource = resource;
                            switch (resource.ResourceType)
                            {
                                case ResourceType.AssemblyLinked:
                                    // TODO
                                    _logger.Warn("AssemblyLinkedResource reference may need to be fixed (to link to newly created assembly)" + resource.Name);
                                    break;

                                case ResourceType.Linked:
                                    // TODO ? (or not)
                                    break;

                                case ResourceType.Embedded:
                                    var er = (EmbeddedResource)resource;
                                    if (er.Name.EndsWith(".resources"))
                                    {
                                        // we don't want to write the bamls to other embedded resource files
                                        bool shouldWriteCollectedBamlStreams =
                                            isPrimaryAssembly &&
                                            $"{assembly.Name.Name}.g.resources".Equals(er.Name);

                                        if (shouldWriteCollectedBamlStreams)
                                            areCollectedStreamsWritten = true;

                                        newResource = FixResxResource(assembly, er, assemblyProcessors,
                                            shouldWriteCollectedBamlStreams ? bamlStreamCollector : null);
                                    }
                                    break;
                            }
                            _targetAssemblyMainModule.Resources.Add(newResource);
                        }
                    }
                }
            }

            if (ikvmExportsLists.Count > 0)
                _targetAssemblyMainModule.Resources.Add(
                    GenerateIkvmExports(ikvmExportsLists));

            if (!_options.NoRepackRes)
                _targetAssemblyMainModule.Resources.Add(
                    GenerateRepackListResource(repackList.ToList()));

            CreateNewBamlResourceIfNeeded(areCollectedStreamsWritten, bamlStreamCollector);
        }