實例 AssemblyLoadContext.Default 負責尋找元件的相依性。 本文說明 AssemblyLoadContext.Default 實例的探查邏輯。
主機已設定探查屬性
啟動運行時間時,運行時間主機會提供一組具名探查屬性,以設定 AssemblyLoadContext.Default 探查路徑。
每個探查屬性都是選擇性的。 如果存在,每個屬性都是包含絕對路徑分隔清單的字串值。 分隔符在 Windows 上是 『;』,而所有其他平臺上的 『:』。
| 屬性名稱 | Description |
|---|---|
TRUSTED_PLATFORM_ASSEMBLIES |
平臺和應用程式元件檔案路徑的清單。 |
PLATFORM_RESOURCE_ROOTS |
用於搜尋衛星資源組件的目錄路徑清單。 |
NATIVE_DLL_SEARCH_DIRECTORIES |
非託管(原生)連結庫的搜尋目錄路徑清單。 |
APP_PATHS |
要搜尋受管理的組件的目錄路徑清單。 |
屬性是如何被設定的?
根據是否存在<myapp>.deps.json檔案,有兩個主要情境來填入屬性。
- 當 *.deps.json 檔案存在時,會剖析以填入探查屬性。
- 當 *.deps.json 檔案不存在時,系統會假設應用程式的目錄包含所有相依性。 目錄的內容用於填充探查屬性。
此外,任何所參考框架的 *.deps.json檔案也會被同樣剖析。
環境變數 DOTNET_ADDITIONAL_DEPS 可用來新增其他相依性。
dotnet.exe 也包含選擇性 --additional-deps 參數,以在應用程式啟動時設定此值。
備註
DOTNET_ADDITIONAL_DEPS環境變數與--additional-deps命令列選項僅適用於依賴框架的應用程式。
這些選項在 自成一體的應用程式中被忽略。
更多資訊請參見 框架依賴部署與自包含部署。
屬性 APP_PATHS 預設不會填入,而且大部分應用程式都會省略。
應用程式使用的所有 *.deps.json 檔案清單可透過 System.AppContext.GetData("APP_CONTEXT_DEPS_FILES")存取。
如何查看受控程式碼中的探測屬性?
要獲得每個屬性,可以使用上述表格中的屬性名稱來呼叫AppContext.GetData(String) 函式。
如何偵錯探查屬性的建構?
.NET Core 運行時間主機會在啟用特定環境變數時輸出有用的追蹤訊息:
| 環境變數 | Description |
|---|---|
DOTNET_HOST_TRACE=1 |
能進行追蹤。 |
DOTNET_HOST_TRACEFILE=<path> |
追蹤檔案路徑,而不是預設 stderr。 |
DOTNET_HOST_TRACE_VERBOSITY |
設置訊息冗長度從 1(最低)到 4(最高)。 |
如需詳細資訊,請參閱 DOTNET_HOST_TRACE環境變數。
Managed 組件預設檢測
探查以定位受控組件時,會AssemblyLoadContext.Default依序查看:
- 符合 AssemblyName.Name 中的
TRUSTED_PLATFORM_ASSEMBLIES檔案(移除擴展名之後)。 - 中
APP_PATHS具有一般擴展名的元件檔案。
衛星(資源)組裝檢測
若要尋找特定文化特性的附屬元件,請建構一組檔案路徑。
針對 PLATFORM_RESOURCE_ROOTS 中的每個路徑,然後再針對 APP_PATHS,附加 CultureInfo.Name 字串、目錄分隔符、AssemblyName.Name 字串,和延伸模組 '.dll'。
如果有任何相符的檔案存在,請嘗試載入並傳回它。
未管理(原生)函式庫探測
運行時間的非受控庫探測演算法在所有平台上都相同。 不過,由於非受控程式庫的實際負載是由基礎平台負責,因此觀察到的行為可能稍有不同。
檢查提供的連結庫名稱是否代表絕對或相對路徑。
如果名稱代表絕對路徑,請直接針對所有後續作業使用名稱。 否則,請使用名稱並建立由平臺設計的組合以供考慮。 組合包含平臺特定前置詞 (例如
lib, ) 和/或後綴 (例如、.dll.dylib和.so)。 這不是詳盡的清單,而且並不代表每個平臺上所做的確切工作。 這隻是考慮的範例。 如需詳細資訊,請參閱 原生連結庫載入。名稱,如果路徑是相對的,則每個組合都會在下列步驟中使用。 第一次成功嘗試載入後,將立即傳回句柄至已載入的動態連結庫。
將它附加至 屬性中
NATIVE_DLL_SEARCH_DIRECTORIES提供的每個路徑,並嘗試載入。如果 DefaultDllImportSearchPathsAttribute 不是在呼叫元件或 p/invoke 上定義或已定義並包含
DllImportSearchPath.AssemblyDirectory,請將名稱或組合附加至呼叫元件的目錄,並嘗試載入。直接使用它來載入函式庫。
表示程式庫無法載入。