using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; namespace ReZero { public static class AssemblyExtensions { public static Assembly[] GetAllDependentAssemblies(this Assembly rootAssembly, Func whereFunc) { var result= AssemblyLoader.GetAllDependentAssemblies(rootAssembly, whereFunc); return result; } } public class AssemblyLoader { public static Assembly[] GetAllDependentAssemblies(Assembly rootAssembly,Func whereFunc) { var visited = new HashSet(); var assemblies = new List(); CollectDependentAssemblies(rootAssembly, assemblies, visited, whereFunc); return assemblies.ToArray(); } private static void CollectDependentAssemblies(Assembly assembly, List assemblies, HashSet visited, Func whereFunc) { if (visited.Contains(assembly)) return; visited.Add(assembly); assemblies.Add(assembly); foreach (var referencedAssemblyName in assembly.GetReferencedAssemblies()) { try { if (!whereFunc(referencedAssemblyName.FullName)) { continue; } Assembly referencedAssembly = Assembly.Load(referencedAssemblyName); CollectDependentAssemblies(referencedAssembly, assemblies, visited,whereFunc); } catch (Exception) { // Ignore assemblies that cannot be loaded } } } } }