private void LoadResources(ResourceCollection resources, MergeAssemblyState state)
 {
     foreach (var resource in resources)
     {
         LoadResource(resource, state);
     }
 }
 private void LoadExportedTypes(ExportedTypeCollection exportedTypes, MergeAssemblyState state)
 {
     foreach (var exportedType in exportedTypes)
     {
         LoadExportedType(exportedType, state);
     }
 }
        private MergeAssemblyState LoadAssembly(Assembly assembly, MergeDuplicateBehavior duplicateBehavior)
        {
            var state = new MergeAssemblyState();

            state.Assembly          = assembly;
            state.DuplicateBehavior = duplicateBehavior;

            LoadModules(assembly.Modules, state);
            LoadResources(assembly.Resources, state);
            LoadExportedTypes(assembly.ExportedTypes, state);

            return(state);
        }
        private void LoadExportedType(TypeReference exportedType, MergeAssemblyState state)
        {
            exportedType = (TypeReference)exportedType.GetOutermostType();

            if (_typeRefs.Contains(exportedType))
            {
                return;
            }

            if (_exportedTypeToOwner.ContainsKey(exportedType))
            {
                return;
            }

            _typeRefs.Add(exportedType);
            _exportedTypeToOwner.Add(exportedType, exportedType.Owner);
        }
        private void MergeModuleReferences(MergeAssemblyState state)
        {
            var moduleState  = state.Modules[0];
            var mergedModule = moduleState.Module;

            foreach (var moduleRef in mergedModule.ModuleReferences)
            {
                if (state.ModuleByName.ContainsKey(moduleRef.Name))
                {
                    continue;
                }

                if (!_moduleRefs.Contains(moduleRef))
                {
                    _moduleRefs.Add(moduleRef);
                }
            }
        }
        private void LoadModules(ModuleCollection modules, MergeAssemblyState state)
        {
            foreach (var module in modules)
            {
                var image = module.Image;
                if (image != null && !image.IsILOnly)
                {
                    continue;
                }

                if (state.ModuleByName.ContainsKey(module.Name))
                {
                    continue;
                }

                var moduleState = LoadModule(module, state.DuplicateBehavior);
                state.Modules.Add(moduleState);
                state.ModuleByName.Add(module.Name, moduleState);
            }
        }
        private void MergeAssembly(MergeAssemblyState state)
        {
            var relocator = new SignatureRelocator(this, state.Modules[0]);

            // Resources
            foreach (var resource in state.Resources)
            {
                var mergedResource = _assembly.Resources.Add();
                resource.CopyTo(mergedResource);
                relocator.Build(mergedResource);
            }

            MergeModuleReferences(state);

            // Modules
            foreach (var moduleState in state.Modules)
            {
                MergeModule(moduleState);
            }
        }
        private void LoadResource(Resource resource, MergeAssemblyState state)
        {
            if (_resourceNames.Contains(resource.Name))
            {
                switch (state.DuplicateBehavior)
                {
                case MergeDuplicateBehavior.Rename:     // Reaname is not supported on resources.
                case MergeDuplicateBehavior.Skip:
                    return;

                case MergeDuplicateBehavior.Throw:
                    throw new AssemblyDefenderException(string.Format(SR.MergeDuplicatedResource, resource.Name, state.Assembly.ToString()));

                default:
                    throw new InvalidOperationException();
                }
            }

            _resourceNames.Add(resource.Name);
            state.Resources.Add(resource);
        }