System.Runtime.Loader.AssemblyLoadContext 類別
本文提供此 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提供兩個延伸點來實作Managed元件解析:
- AssemblyLoadContext.Load(AssemblyName)方法提供 解析、載入及傳回元件的第一個機會AssemblyLoadContext。 AssemblyLoadContext.Load(AssemblyName)如果方法傳
null
回 ,載入器會嘗試將元件載入AssemblyLoadContext.Default - AssemblyLoadContext.Default如果 無法解析元件,則原始AssemblyLoadContext程式會取得第二次解析元件的機會。 運行時間會 Resolving 引發事件。
此外, AssemblyLoadContext.LoadUnmanagedDll(String) 虛擬方法允許自定義預設 Unmanaged 元件解析。 默認實作會傳 null
回 ,這會導致運行時間搜尋使用其默認搜尋原則。 默認搜尋原則適用於大部分案例。
技術挑戰
您無法在單一進程中載入多個版本的執行時間。
警告
載入多個復本或不同版本的架構元件可能會導致非預期且難以診斷的行為。
提示
使用進程界限與遠端或進程間通訊來解決此隔離問題。
元件載入的時間可能會使測試和偵錯變得困難。 元件通常會載入,而不會立即解析其相依性。 相依性會視需要載入:
- 當程式代碼分支至相依元件時。
- 當程式代碼載入資源時。
- 當程式代碼明確載入元件時。
的 AssemblyLoadContext.Load(AssemblyName) 實作可以新增可能需要隔離的新相依性,以允許不同的版本存在。 最自然的實作會將這些相依性放在默認內容中。 仔細的設計可以隔離新的相依性。
相同的元件會多次載入到不同的內容中。
- 這可能會導致錯誤訊息混淆,例如「無法將類型為 『Sample.Plugin』 的物件轉換成 『Sample.Plugin』」。
- 跨隔離界限封送處理並不簡單。 典型的解決方案是使用只載入預設載入內容之元件中定義的介面。