¶Ô±ÈÐÂÎļþ |
| | |
| | |  |
| | | 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; |
| | | }); |
| | | } |
| | | } |
| | | } |