マネージド アセンブリの読み込みアルゴリズム
マネージド アセンブリは、さまざまな段階を伴うアルゴリズムを使用して検出され、読み込まれます。
サテライト アセンブリと WinRT
アセンブリを除くすべてのマネージド アセンブリで同じアルゴリズムが使用されます。
マネージド アセンブリが読み込まれるタイミング
マネージド アセンブリの読み込みをトリガーするための最も一般的なメカニズムは、静的アセンブリ参照です。 これらの参照は、コードが別のアセンブリで定義されている型を使用するときに、コンパイラによって挿入されます。 これらのアセンブリは、ランタイムによって必要に応じて読み込まれます (load-by-name
)。 静的アセンブリ参照が読み込まれる正確なタイミングは指定されていません。 これはランタイム バージョンごとに異なる場合があり、インライン展開などの最適化の影響を受けます。
次の API を直接使用することによっても、読み込みがトリガーされます。
アルゴリズム
次のアルゴリズムでは、ランタイムがマネージド アセンブリを読み込む方法について説明します。
active
AssemblyLoadContext を決定します。- 静的アセンブリ参照の場合、
active
AssemblyLoadContext は、参照元のアセンブリを読み込んだインスタンスです。 - 優先 API の場合、
active
AssemblyLoadContext は明示されます。 - その他の API の場合、
active
AssemblyLoadContext は推論されます。 これらの API では、AssemblyLoadContext.CurrentContextualReflectionContext プロパティが使用されます。 その値がnull
場合、推論される AssemblyLoadContext インスタンスが使用されます。 - 「マネージド アセンブリが読み込まれるタイミング」セクションの表を参照してください。
- 静的アセンブリ参照の場合、
Load-by-name
メソッドの場合、active
な AssemblyLoadContext は以下の優先順位でアセンブリを読み込みます。- その
cache-by-name
を確認します。 - AssemblyLoadContext.Load 関数を呼び出します。
- AssemblyLoadContext.Default インスタンスのキャッシュを確認し、マネージド アセンブリの既定のプローブ ロジックを実行します。 アセンブリが新たに読み込まれた場合は、AssemblyLoadContext.Default インスタンスの
cache-by-name
に参照が追加されます。 - アクティブな AssemblyLoadContext の AssemblyLoadContext.Resolving イベントを発生させます。
- AppDomain.AssemblyResolve イベントを発生します。
- その
その他の種類の読み込みの場合、
active
な AssemblyLoadContext は以下の優先順位でアセンブリを読み込みます。- その
cache-by-name
を確認します。 - 指定されたパスまたは未加工のアセンブリ オブジェクトから読み込みます。 アセンブリが新たに読み込まれた場合は、
active
な AssemblyLoadContext インスタンスのcache-by-name
に参照が追加されます。
- その
どちらの場合も、アセンブリが新しく読み込まれた場合は、AppDomain.AssemblyLoad イベントが発生します。
.NET