共用方式為


預設探查

AssemblyLoadContext.Default 執行個體負責尋找組件的相依性。 本文說明 AssemblyLoadContext.Default 執行個體的探查邏輯。

設定之主機的探查屬性

執行階段一經啟動,執行階段主機便會提供一組具名探查屬性,以設定 AssemblyLoadContext.Default 探查路徑。

每個探查屬性皆非必要。 如有指定,每個屬性會是包含絕對路徑分隔清單的字串值。 分隔符號在 Windows 是 ';';在所有其他平台則是 ':'。

屬性名稱 描述
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 參數,可在應用程式啟動時設定此值。

根據預設不會填入 APP_PATHS 屬性,而且大多數應用程式都會予以省略。

若要存取應用程式使用之所有 *.deps.json 檔案的清單,可利用 System.AppContext.GetData("APP_CONTEXT_DEPS_FILES")

如何查看受控程式碼中的探查屬性

呼叫 AppContext.GetData(String) 函式搭配上表中的屬性名稱,就能使用每個屬性。

如何對探查屬性的建構進行偵錯

特定環境變數啟用時,.NET Core 執行階段主機會輸出實用的追蹤訊息:

環境變數 描述
COREHOST_TRACE=1 啟用追蹤。
COREHOST_TRACEFILE=<path> 追蹤檔案路徑,而不是預設的 stderr
COREHOST_TRACE_VERBOSITY 設定 1 (最低) 至 4 (最高) 的詳細程度。

受控組件的預設探查

當探查尋找受控組件時,AssemblyLoadContext.Default 會依照下列順序查看:

  • 符合 TRUSTED_PLATFORM_ASSEMBLIES (移除副檔名之後)中之 AssemblyName.Name 的檔案。
  • 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. 表示該程式庫無法載入。