既定のプローブ

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 は次の順序で検索します。

  • 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. ライブラリの読み込みに失敗したことを示します。