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提供兩個擴充點來實作 Managed 元件解析:

  1. 方法 AssemblyLoadContext.Load(AssemblyName) 提供 解析、載入和傳回元件的第一個機會 AssemblyLoadContextAssemblyLoadContext.Load(AssemblyName)如果方法傳 null 回 ,載入器會嘗試將元件 AssemblyLoadContext.Default 載入 。
  2. AssemblyLoadContext.Default如果 無法解析元件,原始 AssemblyLoadContext 會取得第二次解析元件的機會。 執行時間會 Resolving 引發 事件。

此外, AssemblyLoadContext.LoadUnmanagedDll(String) 虛擬方法允許自訂預設 Unmanaged 元件解析。 預設實作會傳 null 回 ,這會導致執行時間搜尋使用其預設搜尋原則。 預設搜尋原則足以用於大部分的案例。

技術挑戰

  • 無法在單一進程中載入多個版本的執行時間。

    警告

    載入多個複本或不同版本的架構元件可能會導致非預期且難以診斷的行為。

    提示

    使用具有遠端處理或處理序間通訊的進程界限來解決此隔離問題。

  • 元件載入的時間可能會讓測試和偵錯變得困難。 元件通常會載入,而不會立即解析其相依性。 相依性會視需要載入:

    • 當程式碼分支至相依元件時。
    • 當程式碼載入資源時。
    • 當程式碼明確載入元件時。
  • AssemblyLoadContext.Load(AssemblyName) 實作可以新增可能需要隔離的新相依性,以允許不同的版本存在。 最自然的實作會將這些相依性放在預設內容中。 仔細設計可以隔離新的相依性。

  • 相同的元件多次載入至不同的內容。

    • 這可能會導致混淆的錯誤訊息,例如「無法將類型為 'Sample.Plugin' 的物件轉換成 'Sample.Plugin'」。
    • 跨隔離界限封送處理是非簡單的。 典型的解決方案是使用只載入預設載入內容之元件中定義的介面。

建構函式

AssemblyLoadContext()

初始化 AssemblyLoadContext 類別的新執行個體。

AssemblyLoadContext(Boolean)

以指示是否啟用卸載的值來初始化 AssemblyLoadContext 類別的新執行個體。

AssemblyLoadContext(String, Boolean)

以指示是否啟用卸載的名稱和值來初始化 AssemblyLoadContext 類別的新執行個體。

屬性

All

傳回所有 AssemblyLoadContext 執行個體的集合。

Assemblies

傳回載入至 AssemblyLoadContextAssembly 執行個體的集合。

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)

取得 AssemblyLoadContext,其中包含指定的 Assembly

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 時。

適用於

另請參閱