AssemblyLoadContext.Default インスタンスは、アセンブリの依存関係を見つける役割を担います。 この記事では、 AssemblyLoadContext.Default インスタンスのプローブ ロジックについて説明します。
ホストで構成されたプローブ プロパティ
ランタイムが開始されると、ランタイム ホストは、プローブ パスを構成する名前付きプローブ プロパティのセット AssemblyLoadContext.Default 提供します。
各プローブ プロパティは省略可能です。 存在する場合、各プロパティは絶対パスの区切りリストを含む文字列値です。 区切り記号は Windows では ';' で、他のすべてのプラットフォームでは ':' です。
プロパティ名 | 説明 |
---|---|
TRUSTED_PLATFORM_ASSEMBLIES |
プラットフォームおよびアプリケーション アセンブリ のファイル パスの一覧。 |
PLATFORM_RESOURCE_ROOTS |
サテライト リソース アセンブリを検索するディレクトリ パスの一覧。 |
NATIVE_DLL_SEARCH_DIRECTORIES |
アンマネージド (ネイティブ) ライブラリを検索するディレクトリ パスの一覧。 |
APP_PATHS |
マネージド アセンブリを検索するディレクトリ パスの一覧。 |
プロパティにはどのように値が割り当てられますか?
<myapp>.deps.json ファイルが存在するかどうかに応じて、プロパティを設定する主なシナリオは 2 つあります。
- *.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 は次の順序で表示されます。
-
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
が含まれている場合は、呼び出し元アセンブリのディレクトリに名前または組み合わせを追加して読み込みを試みます。ライブラリを読み込むには、直接使用します。
ライブラリの読み込みに失敗したことを示します。
.NET