当前位置: 首页 > news >正文

解决 .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();
}

 

http://www.sczhlp.com/news/81332/

相关文章:

  • 从KPI管理转向更困难的OKR管理的企业都在想什么
  • MyBatis-Plus 实现PostgreSQL数据库jsonb类型的保存与查询
  • 小孩做阅读的网站有哪些wordpress支持视频播放器插件
  • 江阴网站建设培训品牌网线和普通网线有什么区别
  • 肥乡网站建设dedecms网站关键字在哪个表
  • dw做的简单的个人网站网盘柳市网站托管
  • 网站如何诊断华为手表网站
  • (期望)名字(name)
  • 新手小白如何快速入门PostgreSQL
  • 大学 建网站安卓手机app开发用什么软件
  • 网站建设邀标方案乐清app开发公司
  • 怎么用网站做类似微博海报设计培训
  • 电商网站建设要多少钱陕西交通建设集团网站体检
  • 网站改版的目的苏州网站设计网站搭建
  • 长春百度网站快速优化开发软件需要什么条件
  • Day03 课程
  • MathType7下载安装2025最新下载+安装+教程(附安装包)
  • Linux Strace 系统调用工具详解与企业应用
  • 想进大厂?从学习圈子里的“管理术语”开始
  • 上海手机网站建设哪家好镇江网站建设介绍服务
  • 电力建设监理招聘网站经典网站设计欣赏
  • 单位网站平台建设汇报黄金网站软件入口免费
  • 百度seo站长工具网站开发好公司
  • 配电网二进制粒子群重构(BPSO)
  • 模板 AE PR 达芬奇 剪影
  • 汕头市企业网站建设服务机构做网站的论文摘要
  • 如何自动删除重复执行的任务?
  • 开始更新第一篇
  • 网站建设协议书是否贴花郑州pc网站建设
  • 品牌网站设计制作价格wordpress 缩进