RuntimeHelper.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using System.Runtime.Loader;
  6. using Microsoft.Extensions.DependencyModel;
  7. namespace GxPress.Api.ServiceExtensions
  8. {
  9. public class RuntimeHelper
  10. {
  11. /// <summary>
  12. /// 获取项目程序集,排除所有的系统程序集(Microsoft.***、System.***等)、Nuget下载包
  13. /// </summary>
  14. /// <returns></returns>
  15. public static IList<Assembly> GetAllAssemblies()
  16. {
  17. var list = new List<Assembly>();
  18. var deps = DependencyContext.Default;
  19. var libs = deps.CompileLibraries
  20. .Where(lib => !lib.Serviceable
  21. && lib.Type != "package"
  22. && lib.Type != "referenceassembly");//排除所有的系统程序集、Nuget下载包
  23. foreach (var lib in libs)
  24. {
  25. try
  26. {
  27. var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(lib.Name));
  28. list.Add(assembly);
  29. }
  30. catch (Exception)
  31. {
  32. // ignored
  33. }
  34. }
  35. return list;
  36. }
  37. public static Assembly GetAssembly(string assemblyName)
  38. {
  39. return GetAllAssemblies().FirstOrDefault(assembly => assembly.FullName.Contains(assemblyName));
  40. }
  41. public static IList<Type> GetAllTypes()
  42. {
  43. var list = new List<Type>();
  44. foreach (var assembly in GetAllAssemblies())
  45. {
  46. var typeInfos = assembly.DefinedTypes;
  47. foreach (var typeInfo in typeInfos)
  48. {
  49. list.Add(typeInfo.AsType());
  50. }
  51. }
  52. return list;
  53. }
  54. public static IList<Type> GetTypesByAssembly(string assemblyName)
  55. {
  56. var list = new List<Type>();
  57. var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(assemblyName));
  58. var typeInfos = assembly.DefinedTypes;
  59. foreach (var typeInfo in typeInfos)
  60. {
  61. list.Add(typeInfo.AsType());
  62. }
  63. return list;
  64. }
  65. public static Type GetImplementType(string typeName, Type baseInterfaceType)
  66. {
  67. return GetAllTypes().FirstOrDefault(t =>
  68. {
  69. if (t.Name == typeName &&
  70. t.GetTypeInfo().GetInterfaces().Any(b => b.Name == baseInterfaceType.Name))
  71. {
  72. var typeInfo = t.GetTypeInfo();
  73. return typeInfo.IsClass && !typeInfo.IsAbstract && !typeInfo.IsGenericType;
  74. }
  75. return false;
  76. });
  77. }
  78. }
  79. }