本文提供此 API 參考文件的補充備註。
AssemblyLoadContext表示載入內容。 在概念上,載入上下文會建立一個範圍來載入、解析,並可能卸除一組元件集。
AssemblyLoadContext主要是為了提供元件載入隔離。 它允許在單一進程內載入多個相同元件的版本。 它會取代 .NET Framework 中多個 AppDomain 實例所提供的隔離機制。
備註
- AssemblyLoadContext 不提供任何安全性功能。 所有程式代碼都有進程的完整許可權。
- .NET Core 2.0 - 2.2 僅限於 AssemblyLoadContext 是一個抽象類別。 若要在這些版本中建立具體類別,請實作 AssemblyLoadContext.Load(AssemblyName) 方法。
運行時間中的使用量
執行時間會實作兩個組件載入上下文:
- AssemblyLoadContext.Default 表示運行時間的預設內容,用於應用程式主要元件及其靜態相依性。
- 方法 Assembly.LoadFile(String) 通過實例化最基本的 AssemblyLoadContext 來隔離其載入的元件。 它有一個簡單的隔離方案,會在自己的 AssemblyLoadContext 中載入每個組件,而不進行相依性解析。
應用程式使用量
應用程式可以自行建立 AssemblyLoadContext ,以針對進階案例建立自定義解決方案。 自定義著重於定義相依性解析機制。
AssemblyLoadContext提供兩個擴展點來實作受管理的組件解析:
-
AssemblyLoadContext.Load(AssemblyName)方法提供AssemblyLoadContext解析、載入及傳回元件的第一次機會。 如果AssemblyLoadContext.Load(AssemblyName)方法傳回
null,載入器會嘗試將元件載入AssemblyLoadContext.Default。 - AssemblyLoadContext.Default如果 無法解析元件,則原始AssemblyLoadContext程式會取得第二次解析元件的機會。 執行階段會引發Resolving事件。
此外,AssemblyLoadContext.LoadUnmanagedDll(String) 虛擬方法允許自定義非受控組件的預設解析。 默認實作會傳回null,這會導致執行時搜尋使用默認搜尋原則。 默認搜尋原則適用於大部分案例。
技術挑戰
您無法在單一程序中載入多個版本的執行階段。
謹慎
載入多個復本或不同版本的架構元件可能會導致非預期且難以診斷的行為。
小提示
使用進程界限與遠端或進程間通訊來解決此隔離問題。
元件載入的時間可能會使測試和偵錯變得困難。 元件通常會被載入,但不會立即解析其相依性。 依賴項會根據需求載入。
- 當程式碼分支至相依程式集時。
- 當程式代碼載入資源時。
- 當程式代碼明確載入元件時。
的 AssemblyLoadContext.Load(AssemblyName) 實作可以新增可能需要隔離的新相依性,以允許不同的版本存在。 最自然的實作會將這些相依性放在默認內容中。 仔細的設計可以隔離新的相依性。
相同的元件會多次載入到不同的內容中。
- 這可能會導致錯誤訊息混淆,例如「無法將類型為 『Sample.Plugin』 的物件轉換成 『Sample.Plugin』」。
- 跨隔離界限封送處理並不簡單。 典型的解決方案是使用只載入預設載入上下文之元件中定義的介面。