マネージド アセンブリは、さまざまなステージを持つアルゴリズムを使用して配置および読み込まれます。
サテライト アセンブリと WinRT アセンブリを除くすべてのマネージド アセンブリは、同じアルゴリズムを使用します。
マネージド アセンブリはいつ読み込まれますか?
マネージド アセンブリの読み込みをトリガーする最も一般的なメカニズムは、静的アセンブリ参照です。 これらの参照は、コードが別のアセンブリで定義された型を使用するたびにコンパイラによって挿入されます。 これらのアセンブリは、ランタイムによって必要に応じて読み込まれます (load-by-name)。 静的アセンブリ参照が読み込まれる正確なタイミングは指定されていません。 ランタイム バージョンによって異なる場合があり、インライン化などの最適化の影響を受けます。
次の API を直接使用すると、読み込みもトリガーされます。
Important
.NET Framework とは異なり、assemblyFileのAssembly.LoadFrom パラメーターは、URI ではなく.NET のファイル パスとして扱われます。 .NET Framework では、ファイル URI (たとえば、 file:///C:/path/to/assembly.dll) ( Assembly.CodeBaseから構築されたものなど) を渡し、アセンブリが正常に読み込まれます。 .NET では、 assemblyFile 値が Path.GetFullPath に渡され、URI が適切に処理されないため、読み込みが失敗します。 既にファイル URI 文字列がある場合は、最初に Uri インスタンスを作成し、その LocalPath プロパティを使用してファイル パスを取得してから、 Assembly.LoadFromを呼び出します。 既に読み込まれているアセンブリのファイル パスを取得するには、Assembly.Locationの代わりにCodeBaseを使用します。
アルゴリズム
次のアルゴリズムでは、ランタイムがマネージド アセンブリを読み込む方法について説明します。
activeAssemblyLoadContextを決定します。- 静的アセンブリ参照の場合、
activeAssemblyLoadContext は参照元アセンブリを読み込んだインスタンスです。 - 優先 API を使用すると、
activeAssemblyLoadContext が明示的になります。 - その他の API は、
activeAssemblyLoadContextを推論します。 これらの API では、 AssemblyLoadContext.CurrentContextualReflectionContext プロパティが使用されます。 その値がnull場合は、推論された AssemblyLoadContext インスタンスが使用されます。 - 「マネージド アセンブリが読み込まれるタイミング」セクションの表を参照してください。
- 静的アセンブリ参照の場合、
Load-by-nameメソッドの場合、activeAssemblyLoadContextは次の優先順位でアセンブリを読み込みます。- その
cache-by-nameを確認します。 - AssemblyLoadContext.Load 関数を呼び出します。
-
AssemblyLoadContext.Default インスタンスのキャッシュを確認し、マネージド アセンブリの既定のプローブ ロジックを実行します。 アセンブリが新しく読み込まれると、 AssemblyLoadContext.Default インスタンスの
cache-by-nameに参照が追加されます。 - アクティブな AssemblyLoadContext の AssemblyLoadContext.Resolving イベントを発生させます。
- AppDomain.AssemblyResolve イベントを発生させます。
- その
その他の種類の読み込みでは、
activeAssemblyLoadContext は次の優先順位でアセンブリを読み込みます。- その
cache-by-nameを確認します。 -
activeAssemblyLoadContextがAssemblyLoadContext.Defaultされている場合は、マネージド アセンブリの既定のプローブ ロジックを実行します。 - 指定したパスまたは生のアセンブリ オブジェクトから読み込みます。 アセンブリが新しく読み込まれると、
activeAssemblyLoadContext インスタンスのcache-by-nameに参照が追加されます。
- その
どちらの場合も、アセンブリが新しく読み込まれた場合は、 AppDomain.AssemblyLoad イベントが発生します。
.NET