| using log4net; | 
| using Microsoft.Extensions.DependencyModel; | 
| using System; | 
| using System.Collections.Generic; | 
| using System.Linq; | 
| using System.Reflection; | 
| using System.Runtime.Loader; | 
| using System.Text; | 
| using System.Threading.Tasks; | 
|   | 
| namespace WIDESEA_Core.Helper | 
| { | 
|     public static class RuntimeExtension | 
|     { | 
|         /// <summary> | 
|         /// 获取项目程序集,排除所有的系统程序集(Microsoft.***、System.***等)、Nuget下载包 | 
|         /// </summary> | 
|         /// <returns></returns> | 
|         public static IList<Assembly> GetAllAssemblies() | 
|         { | 
|             var list = new List<Assembly>(); | 
|             var deps = DependencyContext.Default; | 
|             //只加载项目中的程序集 | 
|             var libs = deps.CompileLibraries.Where(lib => !lib.Serviceable && lib.Type == "project"); //排除所有的系统程序集、Nuget下载包 | 
|             foreach (var lib in libs) | 
|             { | 
|                 try | 
|                 { | 
|                     var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(lib.Name)); | 
|                     list.Add(assembly); | 
|                 } | 
|                 catch (Exception e) | 
|                 { | 
|                     //Log.Debug(e, "GetAllAssemblies Exception:{ex}", e.Message); | 
|                 } | 
|             } | 
|   | 
|             return list; | 
|         } | 
|   | 
|         public static Assembly GetAssembly(string assemblyName) | 
|         { | 
|             return GetAllAssemblies().FirstOrDefault(assembly => assembly.FullName.Contains(assemblyName)); | 
|         } | 
|   | 
|         public static IList<Type> GetAllTypes() | 
|         { | 
|             var list = new List<Type>(); | 
|             foreach (var assembly in GetAllAssemblies()) | 
|             { | 
|                 var typeInfos = assembly.DefinedTypes; | 
|                 foreach (var typeInfo in typeInfos) | 
|                 { | 
|                     list.Add(typeInfo.AsType()); | 
|                 } | 
|             } | 
|   | 
|             return list; | 
|         } | 
|   | 
|         public static IList<Type> GetTypesByAssembly(string assemblyName) | 
|         { | 
|             var list = new List<Type>(); | 
|             var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(assemblyName)); | 
|             var typeInfos = assembly.DefinedTypes; | 
|             foreach (var typeInfo in typeInfos) | 
|             { | 
|                 list.Add(typeInfo.AsType()); | 
|             } | 
|   | 
|             return list; | 
|         } | 
|   | 
|         public static Type GetImplementType(string typeName, Type baseInterfaceType) | 
|         { | 
|             return GetAllTypes().FirstOrDefault(t => | 
|             { | 
|                 if (t.Name == typeName && | 
|                     t.GetTypeInfo().GetInterfaces().Any(b => b.Name == baseInterfaceType.Name)) | 
|                 { | 
|                     var typeInfo = t.GetTypeInfo(); | 
|                     return typeInfo.IsClass && !typeInfo.IsAbstract && !typeInfo.IsGenericType; | 
|                 } | 
|   | 
|                 return false; | 
|             }); | 
|         } | 
|     } | 
| } |