受控組件載入演算法
透過演算法定位及載入受控組件分為幾個不同的階段。
除了附屬組件和 WinRT
組件之外,所有受控組件都使用相同的演算法。
何時會載入受控組件?
最常用來觸發受控組件載入的方法是靜態組件參考。 每當程式碼使用其他組件中定義的類型時,編譯器就會插入這些參考。 這些階件會在執行階段需要時載入 (load-by-name
)。 載入靜態組件參考的確切時間不確定, 會隨執行階段版本及最佳化 (例如內嵌) 的影響而異。
直接使用下列 API 也會觸發載入:
演算法
下列演算法描述執行階段如何載入受控組件。
決定
active
AssemblyLoadContext。- 對於靜態組件參考,
active
AssemblyLoadContext 是載入參考組件的執行個體。 - 優先使用的 API 會直接指定
active
AssemblyLoadContext。 - 其他 API 則會推斷
active
AssemblyLoadContext。 對於這些 API,會使用 AssemblyLoadContext.CurrentContextualReflectionContext 屬性。 若其值為null
,則會使用推斷的 AssemblyLoadContext 執行個體。 - 請參閱何時載入受控組件一節中的表格。
- 對於靜態組件參考,
對於
Load-by-name
方法,active
AssemblyLoadContext 會依下列優先順序載入組件:- 檢查其
cache-by-name
。 - 呼叫 AssemblyLoadContext.Load 函式。
- 檢查 AssemblyLoadContext.Default 執行個體的快取,然後執行受控組件的預設探查邏輯。 若是新載入的組件,則會新增參考至 AssemblyLoadContext.Default 執行個體的
cache-by-name
。 - 為作用中的 Preferred API 引發 AssemblyLoadContext.Resolving 事件。
- 引發 AppDomain.AssemblyResolve 事件。
- 檢查其
對於其他類型的載入,
active
AssemblyLoadContext 會依下列優先順序載入組件:- 檢查其
cache-by-name
。 - 從指定的路徑或原始組件物件載入。 若是新載入的組件,則會新增參考至
active
AssemblyLoadContext 執行個體的cache-by-name
。
- 檢查其
無論何種情況,只要是新載入的組件,都會引發 AppDomain.AssemblyLoad 事件。