当前位置: 首页 > 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.gsyq.cn/news/133.html

相关文章:

  • MyBatis-Plus 实现PostgreSQL数据库jsonb类型的保存与查询
  • katalon常用定位元素Xpath合集
  • (期望)名字(name)
  • MathType7下载安装2025最新下载+安装+教程(附安装包)
  • 模板 AE PR 达芬奇 剪影
  • 如何自动删除重复执行的任务?
  • 开始更新第一篇
  • springboot~SpringData自定义Repository的正确方式
  • Linux之进程状态
  • 2. O(NlogN)的排序
  • React-手写支持多文件、并行上传、串行上传、分片上传、单文件上传、失败自动重试、自动上传/手动按钮上传切换
  • postcss-px-to-viewport-8-plugin无法转换tailwindcss样式问题
  • 82、SpringMVC 参数传递,浏览器和服务器之间的数据传输
  • 问卷调查数据库设计
  • Linux 系统调用详解与工作机制
  • The 2025 Sichuan Provincial Collegiate Programming Contest
  • 详细介绍:Android 热点开发的相关api总结
  • 十大经典排序算法 - lucky
  • 基于Operator方式和二进制方式部署prometheus环境
  • 27家网省
  • 使用DeepState进行API模糊测试的技术解析(第二部分)
  • Linux 进程管理之软硬限制以及企业应用实践
  • 智能血压计芯片解决方案AI版
  • MySQL约束
  • JDK 24.0.1 下载安装教程与环境配置教程(Windows10/11超详细图文安装步骤)
  • PTA
  • 82、制作座位表
  • 第十天 C#学习事件 021
  • 事半功倍是蠢蛋52 使用docker-compose.override.yml
  • [TJOI2015] 概率论 题解