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 { /// /// 获取当前项目中所有的程序集 /// /// 返回项目中所有非系统程序集的集合 /// /// 该方法会过滤掉系统程序集和NuGet包,只加载项目自身的程序集。 /// 加载失败的程序集会被忽略,不会抛出异常。 /// public static IList GetAllAssemblies() { var list = new List(); 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; } /// /// 根据程序集名称获取对应的程序集 /// /// 要查找的程序集名称 /// 找到的程序集,若未找到则返回null public static Assembly GetAssembly(string assemblyName) { return GetAllAssemblies().FirstOrDefault(assembly => assembly.FullName.Contains(assemblyName)); } /// /// 获取当前应用程序域中所有程序集定义的类型集合 /// /// 包含所有类型的列表 public static IList GetAllTypes() { var list = new List(); foreach (var assembly in GetAllAssemblies()) { var typeInfos = assembly.DefinedTypes; foreach (var typeInfo in typeInfos) { list.Add(typeInfo.AsType()); } } return list; } /// /// 通过程序集名称获取该程序集中的所有类型 /// /// 要加载的程序集名称 /// 包含程序集中所有类型的列表 public static IList GetTypesByAssembly(string assemblyName) { var list = new List(); var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(assemblyName)); var typeInfos = assembly.DefinedTypes; foreach (var typeInfo in typeInfos) { list.Add(typeInfo.AsType()); } return list; } /// /// 根据类型名称和基接口类型获取实现类型 /// /// 要查找的类型名称 /// 基接口类型 /// 符合条件的第一个非抽象、非泛型的类类型,若未找到则返回null 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; }); } } }