受控組件是靠一個具有不同階段的演算法來定位和載入。
除了附屬組件和 WinRT 組件之外,所有受控組件都會使用相同的演算法。
何時載入受管理的組件?
觸發受管控的程序集載入的最常見機制是靜態程序集參考。 每當程式代碼使用另一個元件中定義的類型時,編譯程式就會插入這些參考。 執行階段會視需要載入這些元件load-by-name。 未指定載入靜態元件參考的確切時機。 它可能會因執行時版本而異,並受到內聯等優化的影響。
直接使用下列 API 也會觸發載入:
演算法
下列演算法描述執行階段如何載入受控元件。
決定
activeAssemblyLoadContext。- 針對靜態元件參考,
activeAssemblyLoadContext 是載入參考元件的實例。 - 慣用 API 會明確提出
activeAssemblyLoadContext 。 - 其他 API 推斷
activeAssemblyLoadContext。 針對這些 API,使用AssemblyLoadContext.CurrentContextualReflectionContext 屬性。 如果其值為null,則會使用推斷的 AssemblyLoadContext 實例。 - 請參閱「何時載入 Managed 元件?」一節中的表格。
- 針對靜態元件參考,
針對
Load-by-name方法,activeAssemblyLoadContext將依以下優先順序載入程式庫:- 檢查其
cache-by-name。 - 呼叫 AssemblyLoadContext.Load 函式。
- 檢查AssemblyLoadContext.Default實例的快取,並執行Managed Assembly的預設探查邏輯。 當一個新元件被載入時,會將參考新增至 AssemblyLoadContext.Default 實體的
cache-by-name。 - AssemblyLoadContext.Resolving引發使用中 AssemblyLoadContext 的事件。
- 引發 AppDomain.AssemblyResolve 事件。
- 檢查其
對於其他類型的載入,會
activeAssemblyLoadContext 以下列優先順序載入元件:- 檢查其
cache-by-name。 - 從指定的路徑或原始元件物件載入。 如果元件是新載入的,則會將參考新增至
activeAssemblyLoadContext 實體的cache-by-name。
- 檢查其
不論是哪一種情況,如果元件被新載入,則會觸發AppDomain.AssemblyLoad事件。