マネージド アセンブリは、さまざまなステージを持つアルゴリズムを使用して配置および読み込まれます。
サテライト アセンブリと 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