using System.Reflection; public static class AppDomainExtents { /// /// 获取AppDomain所有程序集(先扫描exe目录,然后递归检测exe的依赖) /// /// /// 程序集前缀 /// 如果某个dll被反射加载,同时程序被发布为自包含的单个exe程序,这种dll目前检测不到 /// public static Assembly[] GetAllAssemblies(this AppDomain domain, string prefix = "ips") { Dictionary dic = new Dictionary(); var exe = Assembly.GetEntryAssembly(); dic[exe.FullName] = exe; var files = Directory.GetFiles(domain.BaseDirectory, prefix + "*.dll", SearchOption.AllDirectories); foreach (var item in files) { //如果一个dll在项目中被反射加载,这种情况需要需要从目录中检索dll var assembly = Assembly.LoadFrom(item); dic[assembly.FullName] = assembly; } domain.GetAssemblies().ToList().ForEach(i => { if (dic.ContainsKey(i.FullName)) return; if (i.FullName != null && i.FullName.ToUpper().StartsWith(prefix.ToUpper())) dic[i.FullName] = i; GetReferanceAssemblies(i, dic, prefix); }); var res = dic.Values.OrderBy(p => p.FullName).ToArray(); return res; } static void GetReferanceAssemblies(Assembly assembly, Dictionary dic, string prefix) { assembly.GetReferencedAssemblies().ToList().ForEach(i => { if (dic.ContainsKey(i.FullName)) return; if (i.Name == null || !i.Name.ToUpper().StartsWith(prefix.ToUpper())) return; var ass = Assembly.Load(i); dic[i.FullName] = ass; GetReferanceAssemblies(ass, dic, prefix); }); } }