共用方式為


預設探測

實例 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'。

如果有任何相符的檔案存在,請嘗試載入並傳回它。

未管理(原生)函式庫探測

運行時間的非受控庫探測演算法在所有平台上都相同。 不過,由於非受控程式庫的實際負載是由基礎平台負責,因此觀察到的行為可能稍有不同。

  1. 檢查提供的連結庫名稱是否代表絕對或相對路徑。

  2. 如果名稱代表絕對路徑,請直接針對所有後續作業使用名稱。 否則,請使用名稱並建立由平臺設計的組合以供考慮。 組合包含平臺特定前置詞 (例如lib, ) 和/或後綴 (例如、 .dll.dylib.so)。 這不是詳盡的清單,而且並不代表每個平臺上所做的確切工作。 這隻是考慮的範例。 如需詳細資訊,請參閱 原生連結庫載入

  3. 名稱,如果路徑是相對的,則每個組合都會在下列步驟中使用。 第一次成功嘗試載入後,將立即傳回句柄至已載入的動態連結庫。

    • 將它附加至 屬性中 NATIVE_DLL_SEARCH_DIRECTORIES 提供的每個路徑,並嘗試載入。

    • 如果 DefaultDllImportSearchPathsAttribute 不是在呼叫元件或 p/invoke 上定義或已定義並包含 DllImportSearchPath.AssemblyDirectory,請將名稱或組合附加至呼叫元件的目錄,並嘗試載入。

    • 直接使用它來載入函式庫。

  4. 表示程式庫無法載入。