AssemblyLoadContext 类

定义

表示程序集加载范围的运行时概念。

public ref class AssemblyLoadContext
public ref class AssemblyLoadContext abstract
public class AssemblyLoadContext
public abstract class AssemblyLoadContext
type AssemblyLoadContext = class
Public Class AssemblyLoadContext
Public MustInherit Class AssemblyLoadContext
继承
AssemblyLoadContext

注解

表示 AssemblyLoadContext 加载上下文。 从概念上讲,加载上下文会创建一个用于加载、解析和可能卸载一组程序集的范围。

主要 AssemblyLoadContext 是为了提供程序集加载隔离。 它允许在单个进程中加载同一程序集的多个版本。 它替换.NET Framework中多个AppDomain实例提供的隔离机制。

备注

运行时中的用法

运行时实现两个程序集加载上下文:

应用程序使用情况

应用程序可以创建自己的 AssemblyLoadContext 解决方案,以便为高级方案创建自定义解决方案。 自定义侧重于定义依赖项解析机制。

提供 AssemblyLoadContext 两个扩展点来实现托管程序集解析:

  1. 该方法 AssemblyLoadContext.Load(AssemblyName) 为解析、加载和返回程序集提供了第一个机会 AssemblyLoadContextAssemblyLoadContext.Load(AssemblyName)如果该方法返回null,加载程序将尝试将程序集加载到该程序集中AssemblyLoadContext.Default
  2. AssemblyLoadContext.Default如果无法解析程序集,则原始AssemblyLoadContext程序集获得第二次解析该程序集的机会。 运行时引发 Resolving 事件。

此外, AssemblyLoadContext.LoadUnmanagedDll(String) 虚拟方法还允许自定义默认的非托管程序集解析。 默认实现返回 null,这会导致运行时搜索使用其默认搜索策略。 默认搜索策略足以满足大多数方案。

技术挑战

  • 在单个进程中无法加载运行时的多个版本。

    注意

    加载多个副本或不同版本的框架程序集可能会导致意外和难以诊断的行为。

    提示

    将进程边界与远程处理或进程间通信配合使用来解决此隔离问题。

  • 程序集加载的计时会使测试和调试变得困难。 程序集通常加载,而不会立即解析其依赖项。 依赖项会根据需要加载:

    • 当代码分支到依赖程序集时。
    • 代码加载资源时。
    • 代码显式加载程序集时。
  • AssemblyLoadContext.Load(AssemblyName)实现可以添加新的依赖项,这些依赖项可能需要隔离,以允许不同的版本存在。 最自然的实现会将这些依赖项置于默认上下文中。 仔细的设计可以隔离新的依赖项。

  • 同一程序集多次加载到不同的上下文中。

    • 这可能会导致错误消息混乱,例如“无法将”Sample.Plugin“类型的对象强制转换为”Sample.Plugin”。
    • 跨隔离边界封送处理是非微不足道的。 典型的解决方案是在仅加载到默认加载上下文的程序集中定义的接口。

构造函数

AssemblyLoadContext()

初始化 AssemblyLoadContext 类的新实例。

AssemblyLoadContext(Boolean)

使用一个指示是否启用卸载的值来初始化 AssemblyLoadContext 类的新实例。

AssemblyLoadContext(String, Boolean)

使用名称和指示是否启用卸载的值来初始化 AssemblyLoadContext 类的新实例。

属性

All

返回一个包含所有 AssemblyLoadContext 实例的集合。

Assemblies

返回一个集合,它包含在 AssemblyLoadContext 中加载的 Assembly 实例。

CurrentContextualReflectionContext

获取由最近调用 EnterContextualReflection() 而设置的 AssemblyLoadContext

Default

获取默认的 AssemblyLoadContext。 默认上下文包含主应用程序程序集及其静态依赖项。

IsCollectible

获取一个值,该值指示此 AssemblyLoadContext 是否可回收。

Name

获取 AssemblyLoadContext 的名称。

方法

EnterContextualReflection()

CurrentContextualReflectionContext 设置为 thisAssemblyLoadContext

EnterContextualReflection(Assembly)

CurrentContextualReflectionContext 设置为加载了程序集的 AssemblyLoadContext

Equals(Object)

确定指定对象是否等于当前对象。

(继承自 Object)
Finalize()

允许对象在被“垃圾回收”之前尝试释放资源并执行其他清理操作。

GetAssemblyName(String)

获取 AssemblyName 的程序集路径。

GetHashCode()

作为默认哈希函数。

(继承自 Object)
GetLoadContext(Assembly)

获取包含指定 AssemblyAssemblyLoadContext

GetType()

获取当前实例的 Type

(继承自 Object)
Load(AssemblyName)

在派生类中重写时,允许基于其 AssemblyName解析程序集。

LoadFromAssemblyName(AssemblyName)

根据 AssemblyName 解析并加载程序集。

LoadFromAssemblyPath(String)

加载指定路径上的程序集文件的内容。

LoadFromNativeImagePath(String, String)

在指定路径上加载托管程序集文件的本机映像的内容。

LoadFromStream(Stream)

加载带有基于通用对象文件格式 (COFF) 的映像的程序集,该映像包含托管程序集。

LoadFromStream(Stream, Stream)

加载带有基于通用对象文件格式 (COFF) 的映像的程序集,此映像包含托管程序集,并且还可以选择包括程序集的符号。

LoadUnmanagedDll(String)

允许派生的类按名称加载非托管库。

LoadUnmanagedDllFromPath(String)

从指定路径加载非托管库。

MemberwiseClone()

创建当前 Object 的浅表副本。

(继承自 Object)
SetProfileOptimizationRoot(String)

设置用于存储此加载上下文的优化配置文件的根路径。

StartProfileOptimization(String)

启动指定配置文件的配置文件优化。

ToString()

返回此加载上下文的字符串表示形式。

ToString()

返回表示当前对象的字符串。

(继承自 Object)
Unload()

开始卸载此 AssemblyLoadContext

事件

Resolving

在尝试加载到此程序集加载上下文时,程序集解析失败时发生。

ResolvingUnmanagedDll

在解析本机库失败时发生。

Unloading

卸载 AssemblyLoadContext 时发生。

适用于

另请参阅