当前位置: 首页 > 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.agseo.cn/news/188/

相关文章:

  • 从KPI管理转向更困难的OKR管理的企业都在想什么
  • MyBatis-Plus 实现PostgreSQL数据库jsonb类型的保存与查询
  • katalon常用定位元素Xpath合集
  • 【项目实战】基于Hi3861的鸿蒙智能小车(循迹、超声波避障、远程控制、语音控制、4G定位)有教程代码
  • (期望)名字(name)
  • 新手小白如何快速入门PostgreSQL
  • Day03 课程
  • MathType7下载安装2025最新下载+安装+教程(附安装包)
  • Linux Strace 系统调用工具详解与企业应用
  • 想进大厂?从学习圈子里的“管理术语”开始
  • 配电网二进制粒子群重构(BPSO)
  • 模板 AE PR 达芬奇 剪影
  • 如何自动删除重复执行的任务?
  • 开始更新第一篇
  • springboot~SpringData自定义Repository的正确方式
  • Agisoft Metashape Professional 2.2.2.21069 多视点三维建模设计
  • Linux之进程状态
  • 2. O(NlogN)的排序
  • 【Python】使用matplotlib绘图,显示中文字符。
  • React-手写支持多文件、并行上传、串行上传、分片上传、单文件上传、失败自动重试、自动上传/手动按钮上传切换
  • Linux服务器中代码仓库(gitea+drone)搭建
  • 二分查找
  • postcss-px-to-viewport-8-plugin无法转换tailwindcss样式问题
  • html中的latex数据公式展示
  • IK Multimedia TONEX MAX 1.10.2 逼真音色建模
  • 重塑云上 AI 应用“运行时”,函数计算进化之路
  • 82、SpringMVC 参数传递,浏览器和服务器之间的数据传输
  • 问卷调查数据库设计
  • Linux 系统调用详解与工作机制
  • 一客一策:Data Agent 如何重构大模型时代的智能营销?