AppDomainExtents.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. using System.Reflection;
  2. public static class AppDomainExtents
  3. {
  4. /// <summary>
  5. /// 获取AppDomain所有程序集(先扫描exe目录,然后递归检测exe的依赖)
  6. /// </summary>
  7. /// <param name="domain"></param>
  8. /// <param name="prefix">程序集前缀</param>
  9. /// <remarks>如果某个dll被反射加载,同时程序被发布为自包含的单个exe程序,这种dll目前检测不到</remarks>
  10. /// <returns></returns>
  11. public static Assembly[] GetAllAssemblies(this AppDomain domain, string dllKey = "DW5S")
  12. {
  13. Dictionary<string, Assembly> dic = new Dictionary<string, Assembly>();
  14. var exe = Assembly.GetEntryAssembly();
  15. dic[exe.FullName] = exe;
  16. var files = Directory.GetFiles(domain.BaseDirectory, "*" + dllKey + "*.dll", SearchOption.AllDirectories);
  17. foreach (var item in files)
  18. {
  19. //如果一个dll在项目中被反射加载,这种情况需要需要从目录中检索dll
  20. var assembly = Assembly.LoadFrom(item);
  21. dic[assembly.FullName] = assembly;
  22. }
  23. domain.GetAssemblies().ToList().ForEach(i =>
  24. {
  25. if (dic.ContainsKey(i.FullName)) return;
  26. if (i.FullName != null && i.FullName.ToUpper().Contains(dllKey.ToUpper()))
  27. dic[i.FullName] = i;
  28. GetReferanceAssemblies(i, dic, dllKey);
  29. });
  30. var res = dic.Values.OrderBy(p => p.FullName).ToArray();
  31. return res;
  32. }
  33. static void GetReferanceAssemblies(Assembly assembly, Dictionary<string, Assembly> dic, string dllKey)
  34. {
  35. assembly.GetReferencedAssemblies().ToList().ForEach(i =>
  36. {
  37. if (dic.ContainsKey(i.FullName)) return;
  38. if (i.Name == null || !i.Name.ToUpper().Contains(dllKey.ToUpper())) return;
  39. var ass = Assembly.Load(i);
  40. dic[i.FullName] = ass;
  41. GetReferanceAssemblies(ass, dic, dllKey);
  42. });
  43. }
  44. }