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); }