預設探查
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'。
如有任何相符的檔案,嘗試加以載入及傳回。
非受控 (原生) 程式庫探查
執行階段的非受控程式庫探查演算法在所有平台上全都相同。 但由於非受控程式庫的實際載件由基礎平台執行,因此觀察到的行為可能會略有差異。
檢查提供的程式庫名稱,代表了絕對或相對路徑。
若名該稱代表絕對路徑,請直接對所有後續作業使用該名稱。 否則,請使用該名稱,並建立所需要的平台定義組合。 組合中包含平台專用的前置詞 (例如
lib
和 (或) 尾碼 (例如.dll
、.dylib
和.so
)。 這不是詳細清單,而且不代表每個平台上確切需要的時間。 這只是一些考慮事項的範例。 如需詳細資訊,請參閱原生程式庫載入。若是相對路徑,下列步驟中將會使用名稱與每個組合。 第一次成功載入後,會嘗試立即將控制碼傳回載入的程式庫。
請將其附加到
NATIVE_DLL_SEARCH_DIRECTORIES
屬性中提供的每個路徑,並嘗試載入。若未在呼叫組件中定義 DefaultDllImportSearchPathsAttribute,或定義了 p/invoke 及包含了
DllImportSearchPath.AssemblyDirectory
,請將該名稱或組合附加至呼叫組件的目錄,並嘗試載入。直接使用,以載入程式庫。
表示該程式庫無法載入。