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)AssemblyLoadContext 提供了解析、加载和返回程序集的首次机会。 如果AssemblyLoadContext.Load(AssemblyName)方法返回null,加载程序将尝试将程序集加载到AssemblyLoadContext.Default中。
  2. AssemblyLoadContext.Default如果无法解析程序集,则原始AssemblyLoadContext程序集获得第二次解析该程序集的机会。 运行时引发 Resolving 事件。

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

技术挑战

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

    Caution

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

    Tip

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

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

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

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

    • 这可能会导致令人困惑的错误消息,例如“无法将类型为‘Sample.Plugin’的对象强制转换为‘Sample.Plugin’”。
    • 跨隔离边界封送处理很复杂。 典型的解决方案是使用仅加载到默认加载上下文的程序集中定义的接口。

构造函数

名称 说明
AssemblyLoadContext()

初始化 AssemblyLoadContext 类的新实例。

AssemblyLoadContext(Boolean)

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

AssemblyLoadContext(String, Boolean)

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

属性

名称 说明
All

返回所有 AssemblyLoadContext 实例的集合。

Assemblies

返回加载在 . 中的Assembly实例的AssemblyLoadContext集合。

CurrentContextualReflectionContext

获取由最近调用AssemblyLoadContextEnterContextualReflection()集合。

Default

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

IsCollectible

获取一个值,该值指示这 AssemblyLoadContext 是否是可收集的。

Name

获取 . 的名称 AssemblyLoadContext

方法

名称 说明
EnterContextualReflection()

设置为 CurrentContextualReflectionContextthisAssemblyLoadContext.

EnterContextualReflection(Assembly)

设置为CurrentContextualReflectionContextAssemblyLoadContext加载程序集的集合。

Equals(Object)

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

(继承自 Object)
Finalize()

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

GetAssemblyName(String)

获取程序集路径的一个 AssemblyName

GetHashCode()

用作默认哈希函数。

(继承自 Object)
GetLoadContext(Assembly)

AssemblyLoadContext获取包含指定的 Assembly

GetType()

获取当前实例的 Type

(继承自 Object)
Load(AssemblyName)

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

LoadFromAssemblyName(AssemblyName)

解析并加载给定程序集 AssemblyName的程序集。

LoadFromAssemblyPath(String)

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

LoadFromNativeImagePath(String, String)

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

LoadFromStream(Stream, Stream)

加载具有基于通用对象文件格式(COFF)的程序集,其中包含托管程序集(可选)包括程序集的符号。

LoadFromStream(Stream)

使用包含托管程序集的通用对象文件格式(COFF)映像加载程序集。

LoadUnmanagedDll(String)

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

LoadUnmanagedDllFromPath(String)

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

MemberwiseClone()

创建当前 Object的浅表副本。

(继承自 Object)
SetProfileOptimizationRoot(String)

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

StartProfileOptimization(String)

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

ToString()

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

ToString()

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

(继承自 Object)
Unload()

启动此 AssemblyLoadContext卸载。

活动

名称 说明
Resolving

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

ResolvingUnmanagedDll

当本机库的解析失败时发生。

Unloading

卸载时 AssemblyLoadContext 发生。

适用于

另请参阅