解决 .NET 7 在 Linux 上获取程序集的问题
方案
1 /// <summary> 2 /// 获取应用有效程序集 3 /// </summary> 4 /// <returns>IEnumerable<Assembly></returns> 5 private static IEnumerable<Assembly> GetAssemblies() 6 { 7 // 需排除的程序集后缀 8 var excludeAssemblyNames = new string[] { 9 "Database.Migrations", 10 }; 11 12 // 获取当前应用程序域中的所有已加载程序集 13 var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList(); 14 15 // 尝试通过 DependencyContext 获取更多程序集(主要适用于发布为单文件的情况) 16 var dependencyContext = DependencyContext.Default; 17 if (dependencyContext != null) 18 { 19 var scanAssemblies = dependencyContext.CompileLibraries 20 .Where(lib => lib.Type == "project" || 21 (lib.Type == "package" && lib.Name.StartsWith("ASPNet.FrameworkLightAPI")) && 22 !excludeAssemblyNames.Any(j => lib.Name.EndsWith(j))); 23 24 foreach (var lib in scanAssemblies) 25 { 26 try 27 { 28 var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(lib.Name)); 29 if (!assemblies.Any(a => a.FullName == assembly.FullName)) 30 { 31 assemblies.Add(assembly); 32 } 33 } 34 catch 35 { 36 // 忽略加载失败的程序集 37 continue; 38 } 39 } 40 } 41 42 return assemblies 43 .Where(a => !excludeAssemblyNames.Any(ex => a.FullName.Contains(ex))) 44 .Distinct(); 45 }
替代方案(更可靠)
private static IEnumerable<Assembly> GetAssemblies() { // 需排除的程序集后缀 var excludeAssemblyNames = new string[] { "Database.Migrations", }; // 获取入口程序集 var entryAssembly = Assembly.GetEntryAssembly(); var assemblies = new List<Assembly> { entryAssembly }; // 获取所有引用的程序集 var referencedAssemblies = entryAssembly.GetReferencedAssemblies(); foreach (var assemblyName in referencedAssemblies) { try { var assembly = Assembly.Load(assemblyName); if (!excludeAssemblyNames.Any(ex => assembly.FullName.Contains(ex))) { assemblies.Add(assembly); } } catch { // 忽略加载失败的程序集 continue; } } return assemblies.Distinct(); }
本文来自博客园,作者:南風未起,转载请注明原文链接:https://www.cnblogs.com/Andy-Blog/p/19080223

浙公网安备 33010602011771号