System.Runtime.Loader.dll 核心功能与缺失影响
.NET Core / .NET 5+ 程序集加载体系的关键基础组件
核心定位
System.Runtime.Loader.dll 是 .NET Core 及后续版本运行时中负责程序集加载与卸载的基础程序集,核心类型包括 AssemblyLoadContext、AssemblyDependencyResolver 等。它让宿主不再只能依赖默认加载行为,而是可以按上下文、目录、依赖图和生命周期管理程序集。对于插件系统、模块化应用、脚本引擎、热重载框架以及多版本共存的桌面/服务程序,这个程序集承担着“加载入口”和“隔离边界”的双重角色。
核心功能
- 加载上下文定义 AssemblyLoadContext 抽象,允许创建独立加载上下文,隔离同名不同版本程序集,降低依赖冲突。
- 默认上下文提供 AssemblyLoadContext.Default,承载应用启动阶段的主程序集和共享框架程序集。
- 自定义解析可重写 Load(AssemblyName)、LoadFromAssemblyPath、LoadFromStream,实现按需加载、延迟加载和私有依赖加载。
- 依赖解析通过 AssemblyDependencyResolver 读取 .deps.json,定位托管依赖、运行时资产和原生库路径。
- 可收集卸载支持 isCollectible: true 的上下文,调用 Unload() 后释放程序集、类型和静态字段,为插件热替换提供基础。
- 事件扩展通过 Resolving 事件处理未解析程序集,动态返回已加载或新加载的程序集实例。
- 生命周期管理控制加载、解析、卸载、弱引用追踪和上下文终止,影响程序集可见性与内存回收。
缺少 dll 的典型影响
若应用或宿主引用了 System.Runtime.Loader 中的类型,但部署环境缺失该程序集,运行时解析会失败,常见异常包括 FileNotFoundException、FileLoadException、TypeLoadException 或 MissingMethodException。
- 启动阶段崩溃:宿主在初始化插件容器、依赖注入扩展或动态加载模块时,可能直接退出,且异常栈较早,日志不易定位。
- 插件系统失效:无法创建独立 AssemblyLoadContext,插件之间不能隔离,同名程序集版本冲突概率显著上升。
- 卸载能力丧失:动态加载的程序集无法卸载,造成内存增长、文件句柄占用、热更新失败。
- 依赖解析异常:.deps.json 中的资产无法正确映射,托管 DLL、原生库或运行时配置解析中断。
- 框架依赖不匹配:裁剪发布、单文件发布、手工复制输出、运行时安装不完整或版本错配时,风险最高。
- 兼容性退化:原本依赖 AssemblyDependencyResolver 的现代插件模型,只能退回默认加载或 AppDomain 旧模式,跨平台行为不一致。
该程序集通常随 .NET 运行时提供,不应随意用旧版本替换或单独拷贝。排查时应确认目标机器安装的运行时版本、发布模式、deps.json 与 runtimeconfig.json 是否一致,并优先修复框架安装或发布配置。