原文:https://docs.microsoft.com/zh-cn/dotnet/core/dependency-loading/understanding-assemblyloadcontext
AssemblyLoadContext 类是在 .NET Core 中引入的,在 .NET Framework 中不可用。 本文使用概念性信息来补充 AssemblyLoadContext API 文档。
本文与实现动态加载的开发人员有关,尤其是动态加载框架的开发人员。
什么是 AssemblyLoadContext?
每个 .NET 5+ 和 .NET Core 应用程序均隐式使用 AssemblyLoadContext。 它是运行时的提供程序,用于定位和加载依赖项。 只要加载了依赖项,就会调用 AssemblyLoadContext 实例来定位该依赖项。
-
它提供定位、加载和缓存托管程序集和其他依赖项的服务。
-
为了支持动态代码加载和卸载,它创建了一个独立上下文,用于在其自己的 AssemblyLoadContext 实例中加载代码及其依赖项。
何时需要多个 AssemblyLoadContext 实例?
单个 AssemblyLoadContext 实例限制为每个简单程序集名称 AssemblyName.Name 只加载 Assembly 的一个版本。
当动态加载代码模块时,此限制可能会成为一个问题。 每个模块都是独立编译的,并且可能依赖于不同版本的 Assembly。 当不同的模块依赖于常用库的不同版本时,通常会出现此问题。
为了支持动态加载代码,AssemblyLoadContext API 提供在同一个应用程序中加载 Assembly 冲突版本的功能。 每个 AssemblyLoadContext 实例提供一个唯一字典,该字典将每个 AssemblyName.Name 映射到特定的 Assembly 实例。
它还提供了一种方便的机制,将与代码模块相关的依赖项分组,以便以后进行卸载。