C#面试题更新 2026-08-05

请解释 .NET 中的程序集加载上下文是什么,并说明如何利用这些上下文实现插件化开发。

系统设计技术原理方案权衡C#.NET

考察说明

考查对 .NET 程序集加载机制的理解及应用到插件化架构的能力。

回答思路

  1. 【回答框架 1】程序集加载上下文是 .NET 中控制程序集加载和隔离的机制,主要包括默认上下文、加载上下文和仅反射上下文。默认上下文用于应用程序的主程序集及其依赖,加载上下文用于显式加载的插件程序集,允许它们拥有独立的依赖版本,仅反射上下文用于在不执行代码的情况下检查程序集元数据。
  2. 【回答框架 2】插件化开发通常利用 AssemblyLoadContext 类,可以创建自定义的加载上下文来隔离插件及其依赖。每个插件可以加载到独立的上下文,避免不同插件之间的程序集版本冲突。通过自定义 AssemblyLoadContext 的 Load 方法,可以控制依赖项的解析,比如从插件目录加载。
  3. 【回答框架 3】实现插件化时,先定义插件接口或基类,然后使用自定义的 AssemblyLoadContext 加载插件程序集,通过反射创建实例。卸载插件时,调用 AssemblyLoadContext.Unload 方法并释放所有引用,但需要确保没有其他上下文引用插件对象。
  4. 【回答框架 4】需要管理插件目录和依赖,确保插件所需的程序集能够被正确解析。可以设置探测路径,或者从插件目录加载依赖。还要考虑安全性和隔离性,避免插件访问主程序集内部资源。
  5. 【回答框架 5】动态加载和卸载是插件化的关键,.NET Core 3.0+ 支持可卸载的 AssemblyLoadContext,但需要谨慎处理异步操作和静态事件,防止内存泄漏。
  6. 【关键点 1】程序集加载上下文分为默认、加载和仅反射三种。
  7. 【关键点 2】AssemblyLoadContext 可自定义实现插件隔离。
  8. 【关键点 3】插件加载和卸载需管理依赖及释放引用。