共用方式為


受控組件載入演算法

受控組件是靠一個具有不同階段的演算法來定位和載入。

除了附屬組件和 WinRT 組件之外,所有受控組件都會使用相同的演算法。

何時載入受管理的組件?

觸發受管控的程序集載入的最常見機制是靜態程序集參考。 每當程式代碼使用另一個元件中定義的類型時,編譯程式就會插入這些參考。 執行階段會視需要載入這些元件load-by-name。 未指定載入靜態元件參考的確切時機。 它可能會因執行時版本而異,並受到內聯等優化的影響。

直接使用下列 API 也會觸發載入:

API(應用程式介面) 說明 Active AssemblyLoadContext
AssemblyLoadContext.LoadFromAssemblyName Load-by-name 這個實例。
AssemblyLoadContext.LoadFromAssemblyPath
AssemblyLoadContext.LoadFromNativeImagePath
從路徑載入。 這個實例。
AssemblyLoadContext.LoadFromStream 從物件載入。 這個實例。
Assembly.LoadFile 從新 AssemblyLoadContext 實例中的路徑載入 新的 AssemblyLoadContext 實例。
Assembly.LoadFrom 從實例中的 AssemblyLoadContext.Default 路徑載入。
AppDomain.AssemblyResolve新增處理程式。 處理程式會從其目錄載入元件的相依性。
AssemblyLoadContext.Default 執行個體。
Assembly.Load(AssemblyName)
Assembly.Load(String)
Assembly.LoadWithPartialName
Load-by-name 從呼叫端推斷。
偏好 AssemblyLoadContext 方法。
Assembly.Load(Byte[])
Assembly.Load(Byte[], Byte[])
從新 AssemblyLoadContext 實例中的物件載入。 新的 AssemblyLoadContext 實例。
Type.GetType(String)
Type.GetType(String, Boolean)
Type.GetType(String, Boolean, Boolean)
Load-by-name 從呼叫端推斷。
偏好使用帶有 Type.GetType 參數的 assemblyResolver 方法。
Assembly.GetType 如果類型 name 描述元件限定泛型型別,請觸發 Load-by-name 從呼叫端推斷。
建議使用 Type.GetType 作為元件限定型別名稱。
Activator.CreateInstance(String, String)
Activator.CreateInstance(String, String, Object[])
Activator.CreateInstance(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])
Load-by-name 從呼叫端推斷。
偏好 Activator.CreateInstance 方法並以 Type 作為參數。

演算法

下列演算法描述執行階段如何載入受控元件。

  1. 決定 activeAssemblyLoadContext

  2. 針對Load-by-name方法,activeAssemblyLoadContext將依以下優先順序載入程式庫:

  3. 對於其他類型的載入,會 activeAssemblyLoadContext 以下列優先順序載入元件:

    • 檢查其 cache-by-name
    • 從指定的路徑或原始元件物件載入。 如果元件是新載入的,則會將參考新增至 activeAssemblyLoadContext 實體的 cache-by-name
  4. 不論是哪一種情況,如果元件被新載入,則會觸發AppDomain.AssemblyLoad事件。