private IList<ModuleProcessor> GatherModulesNeedingProcessing() { var processors = new List<ModuleProcessor>(); if (!IsModuleProcessable(ModuleDefinition)) { return processors; } var moduleReaders = new List<ModuleReader>(); var stilettoReferences = StilettoReferences.Create(AssemblyResolver); var references = new References(ModuleDefinition, stilettoReferences); var copyLocalAssemblies = new Dictionary<string, bool>(StringComparer.Ordinal); var localDebugFiles = new Queue<string>(); foreach (var copyLocal in ReferenceCopyLocalPaths) { if (copyLocal.EndsWith(".pdb") || copyLocal.EndsWith(".mdb")) { // We'll come back to the debug files after we have a complete // list of local assemblies. localDebugFiles.Enqueue(copyLocal); continue; } if (copyLocal.EndsWith(".exe") || copyLocal.EndsWith(".dll")) { copyLocalAssemblies[copyLocal] = false; } } // Check which assemblies have debug symbols and, consequently, // for which assemblies we will attempt to read and write such symbols. while (localDebugFiles.Count > 0) { var pdb = localDebugFiles.Dequeue(); var rawPath = Path.Combine(Path.GetDirectoryName(pdb), Path.GetFileNameWithoutExtension(pdb)); var dll = rawPath + ".dll"; var exe = rawPath + ".exe"; if (copyLocalAssemblies.ContainsKey(dll)) { copyLocalAssemblies[dll] = true; } if (copyLocalAssemblies.ContainsKey(exe)) { copyLocalAssemblies[exe] = true; } } foreach (var pathAndHasPdb in copyLocalAssemblies) { var path = pathAndHasPdb.Key; var hasPdb = pathAndHasPdb.Value; var assembly = AssemblyDefinition.ReadAssembly(path, new ReaderParameters { ReadSymbols = hasPdb }); // TODO: Figure out how to differentiate between third-party libs and client code. if (assembly.Name.HasPublicKey) { LogWarning("Assembly " + assembly.Name + " is strong-named and will not be processed."); continue; } dependencies[path] = Tuple.Create(assembly, hasPdb); foreach (var module in assembly.Modules) { if (!IsModuleProcessable(module)) { continue; } if (module.IsMain) { var importedCtor = module.Import(references.InternalsVisibleToAttribute); var internalsVisibleTo = new CustomAttribute(importedCtor); internalsVisibleTo.ConstructorArguments.Add(new CustomAttributeArgument(module.TypeSystem.String, ModuleDefinition.Assembly.Name.Name)); module.Assembly.CustomAttributes.Add(internalsVisibleTo); } moduleReaders.Add(ModuleReader.Read(module)); AddModuleToAssemblyDictionary(module, null); } } AddModuleToAssemblyDictionary(ModuleDefinition, null); var mainModuleProcessor = new ModuleProcessor( errorReporter, ModuleDefinition, references, moduleReaders); processors.Add(mainModuleProcessor); return processors; }
private IList <ModuleProcessor> GatherModulesNeedingProcessing() { var processors = new List <ModuleProcessor>(); if (!IsModuleProcessable(ModuleDefinition)) { return(processors); } var moduleReaders = new List <ModuleReader>(); var stilettoReferences = StilettoReferences.Create(AssemblyResolver); var references = new References(ModuleDefinition, stilettoReferences); var copyLocalAssemblies = new Dictionary <string, bool>(StringComparer.Ordinal); var localDebugFiles = new Queue <string>(); foreach (var copyLocal in ReferenceCopyLocalPaths) { if (copyLocal.EndsWith(".pdb") || copyLocal.EndsWith(".mdb")) { // We'll come back to the debug files after we have a complete // list of local assemblies. localDebugFiles.Enqueue(copyLocal); continue; } if (copyLocal.EndsWith(".exe") || copyLocal.EndsWith(".dll")) { copyLocalAssemblies[copyLocal] = false; } } // Check which assemblies have debug symbols and, consequently, // for which assemblies we will attempt to read and write such symbols. while (localDebugFiles.Count > 0) { var pdb = localDebugFiles.Dequeue(); var rawPath = Path.Combine(Path.GetDirectoryName(pdb), Path.GetFileNameWithoutExtension(pdb)); var dll = rawPath + ".dll"; var exe = rawPath + ".exe"; if (copyLocalAssemblies.ContainsKey(dll)) { copyLocalAssemblies[dll] = true; } if (copyLocalAssemblies.ContainsKey(exe)) { copyLocalAssemblies[exe] = true; } } foreach (var pathAndHasPdb in copyLocalAssemblies) { var path = pathAndHasPdb.Key; var hasPdb = pathAndHasPdb.Value; var assembly = AssemblyDefinition.ReadAssembly(path, new ReaderParameters { ReadSymbols = hasPdb }); // TODO: Figure out how to differentiate between third-party libs and client code. if (assembly.Name.HasPublicKey) { LogWarning("Assembly " + assembly.Name + " is strong-named and will not be processed."); continue; } dependencies[path] = Tuple.Create(assembly, hasPdb); foreach (var module in assembly.Modules) { if (!IsModuleProcessable(module)) { continue; } if (module.IsMain) { var importedCtor = module.Import(references.InternalsVisibleToAttribute); var internalsVisibleTo = new CustomAttribute(importedCtor); internalsVisibleTo.ConstructorArguments.Add(new CustomAttributeArgument(module.TypeSystem.String, ModuleDefinition.Assembly.Name.Name)); module.Assembly.CustomAttributes.Add(internalsVisibleTo); } moduleReaders.Add(ModuleReader.Read(module)); AddModuleToAssemblyDictionary(module, null); } } AddModuleToAssemblyDictionary(ModuleDefinition, null); var mainModuleProcessor = new ModuleProcessor( errorReporter, ModuleDefinition, references, moduleReaders); processors.Add(mainModuleProcessor); return(processors); }