public static List<AssemblyInfo> GenerateAssemblyWorklist(Config config) { bool verbose = config.DoVerboseOutput; List<string> assemblyList = new List<string>(); List<AssemblyInfo> assemblyInfoList = new List<AssemblyInfo>(); if (config.UseFileName) { assemblyList = new List<string>(); string inputFile = config.FileName; // Open file, read assemblies one per line, and add them to the assembly list. using (var inputStream = System.IO.File.Open(inputFile, FileMode.Open)) { using (var inputStreamReader = new StreamReader(inputStream)) { string line; while ((line = inputStreamReader.ReadLine()) != null) { // Each line is a path to an assembly. if (!File.Exists(line)) { Console.WriteLine("Can't find {0} skipping...", line); continue; } assemblyList.Add(line); } } } } if (config.HasUserAssemblies) { // Append command line assemblies assemblyList.AddRange(config.AssemblyList); } // Process worklist and produce the info needed for the disasm engines. foreach (var path in assemblyList) { FileAttributes attr; if (File.Exists(path) || Directory.Exists(path)) { attr = File.GetAttributes(path); } else { Console.WriteLine("Can't find assembly or directory at {0}", path); continue; } if ((attr & FileAttributes.Directory) == FileAttributes.Directory) { if (verbose) { Console.WriteLine("Processing directory: {0}", path); } // For the directory case create a stack and recursively find any // assemblies for compilation. List<AssemblyInfo> directoryAssemblyInfoList = IdentifyAssemblies(path, config); // Add info generated at this directory assemblyInfoList.AddRange(directoryAssemblyInfoList); } else { // This is the file case. AssemblyInfo info = new AssemblyInfo { Name = Path.GetFileName(path), Path = Path.GetDirectoryName(path), OutputPath = "" }; assemblyInfoList.Add(info); } } return assemblyInfoList; }
// Recursivly search for assemblies from a root path. private static List<AssemblyInfo> IdentifyAssemblies(string rootPath, Config config) { List<AssemblyInfo> assemblyInfoList = new List<AssemblyInfo>(); string fullRootPath = Path.GetFullPath(rootPath); SearchOption searchOption = (config.Recursive) ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly; // Get files that could be assemblies, but discard currently // ngen'd assemblies. var subFiles = Directory.EnumerateFiles(rootPath, "*", searchOption) .Where(s => (s.EndsWith(".exe") || s.EndsWith(".dll")) && !s.Contains(".ni.")); foreach (var filePath in subFiles) { if (config.DoVerboseOutput) { Console.WriteLine("Scaning: {0}", filePath); } // skip if not an assembly if (!IsAssembly(filePath)) { continue; } string fileName = Path.GetFileName(filePath); string directoryName = Path.GetDirectoryName(filePath); string fullDirectoryName = Path.GetFullPath(directoryName); string outputPath = fullDirectoryName.Substring(fullRootPath.Length).TrimStart(Path.DirectorySeparatorChar); AssemblyInfo info = new AssemblyInfo { Name = fileName, Path = directoryName, OutputPath = outputPath }; assemblyInfoList.Add(info); } return assemblyInfoList; }
public static List <AssemblyInfo> GenerateAssemblyWorklist(Config config) { bool verbose = config.DoVerboseOutput; List <string> assemblyList = new List <string>(); List <AssemblyInfo> assemblyInfoList = new List <AssemblyInfo>(); if (config.UseFileName) { assemblyList = new List <string>(); string inputFile = config.FileName; // Open file, read assemblies one per line, and add them to the assembly list. using (var inputStream = System.IO.File.Open(inputFile, FileMode.Open)) { using (var inputStreamReader = new StreamReader(inputStream)) { string line; while ((line = inputStreamReader.ReadLine()) != null) { // Each line is a path to an assembly. if (!File.Exists(line)) { Console.WriteLine("Can't find {0} skipping...", line); continue; } assemblyList.Add(line); } } } } if (config.HasUserAssemblies) { // Append command line assemblies assemblyList.AddRange(config.AssemblyList); } // Process worklist and produce the info needed for the disasm engines. foreach (var path in assemblyList) { FileAttributes attr; if (File.Exists(path) || Directory.Exists(path)) { attr = File.GetAttributes(path); } else { Console.WriteLine("Can't find assembly or directory at {0}", path); continue; } if ((attr & FileAttributes.Directory) == FileAttributes.Directory) { if (verbose) { Console.WriteLine("Processing directory: {0}", path); } // For the directory case create a stack and recursively find any // assemblies for compilation. List <AssemblyInfo> directoryAssemblyInfoList = IdentifyAssemblies(path, config); // Add info generated at this directory assemblyInfoList.AddRange(directoryAssemblyInfoList); } else { // This is the file case. AssemblyInfo info = new AssemblyInfo { Name = Path.GetFileName(path), Path = Path.GetDirectoryName(path), OutputPath = "" }; assemblyInfoList.Add(info); } } return(assemblyInfoList); }